Merge pull request #1913 from Microsoft/internalDTS
Provide an experimental flag that allows us to emit declarations except for nodes marked with '@internal'.
This commit is contained in:
commit
fab351e0b6
|
@ -134,6 +134,12 @@ module ts {
|
||||||
type: "boolean",
|
type: "boolean",
|
||||||
description: Diagnostics.Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures,
|
description: Diagnostics.Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "stripInternal",
|
||||||
|
type: "boolean",
|
||||||
|
description: Diagnostics.Do_not_emit_declarations_for_code_that_has_an_internal_annotation,
|
||||||
|
experimental: true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "target",
|
name: "target",
|
||||||
shortName: "t",
|
shortName: "t",
|
||||||
|
|
|
@ -433,6 +433,7 @@ module ts {
|
||||||
File_0_not_found: { code: 6053, category: DiagnosticCategory.Error, key: "File '{0}' not found." },
|
File_0_not_found: { code: 6053, category: DiagnosticCategory.Error, key: "File '{0}' not found." },
|
||||||
File_0_must_have_extension_ts_or_d_ts: { code: 6054, category: DiagnosticCategory.Error, key: "File '{0}' must have extension '.ts' or '.d.ts'." },
|
File_0_must_have_extension_ts_or_d_ts: { code: 6054, category: DiagnosticCategory.Error, key: "File '{0}' must have extension '.ts' or '.d.ts'." },
|
||||||
Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: DiagnosticCategory.Message, key: "Suppress noImplicitAny errors for indexing objects lacking index signatures." },
|
Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: DiagnosticCategory.Message, key: "Suppress noImplicitAny errors for indexing objects lacking index signatures." },
|
||||||
|
Do_not_emit_declarations_for_code_that_has_an_internal_annotation: { code: 6056, category: DiagnosticCategory.Message, key: "Do not emit declarations for code that has an '@internal' annotation." },
|
||||||
Variable_0_implicitly_has_an_1_type: { code: 7005, category: DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
|
Variable_0_implicitly_has_an_1_type: { code: 7005, category: DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
|
||||||
Parameter_0_implicitly_has_an_1_type: { code: 7006, category: DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
|
Parameter_0_implicitly_has_an_1_type: { code: 7006, category: DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
|
||||||
Member_0_implicitly_has_an_1_type: { code: 7008, category: DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
|
Member_0_implicitly_has_an_1_type: { code: 7008, category: DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
|
||||||
|
|
|
@ -1725,6 +1725,10 @@
|
||||||
"category": "Message",
|
"category": "Message",
|
||||||
"code": 6055
|
"code": 6055
|
||||||
},
|
},
|
||||||
|
"Do not emit declarations for code that has an '@internal' annotation.": {
|
||||||
|
"category": "Message",
|
||||||
|
"code": 6056
|
||||||
|
},
|
||||||
|
|
||||||
"Variable '{0}' implicitly has an '{1}' type.": {
|
"Variable '{0}' implicitly has an '{1}' type.": {
|
||||||
"category": "Error",
|
"category": "Error",
|
||||||
|
|
|
@ -355,9 +355,86 @@ module ts {
|
||||||
var reportedDeclarationError = false;
|
var reportedDeclarationError = false;
|
||||||
|
|
||||||
var emitJsDocComments = compilerOptions.removeComments ? function (declaration: Node) { } : writeJsDocComments;
|
var emitJsDocComments = compilerOptions.removeComments ? function (declaration: Node) { } : writeJsDocComments;
|
||||||
|
var emit = compilerOptions.stripInternal ? stripInternal : emitNode;
|
||||||
|
|
||||||
var aliasDeclarationEmitInfo: AliasDeclarationEmitInfo[] = [];
|
var aliasDeclarationEmitInfo: AliasDeclarationEmitInfo[] = [];
|
||||||
|
|
||||||
|
// Contains the reference paths that needs to go in the declaration file.
|
||||||
|
// Collecting this separately because reference paths need to be first thing in the declaration file
|
||||||
|
// and we could be collecting these paths from multiple files into single one with --out option
|
||||||
|
var referencePathsOutput = "";
|
||||||
|
|
||||||
|
if (root) {
|
||||||
|
// Emitting just a single file, so emit references in this file only
|
||||||
|
if (!compilerOptions.noResolve) {
|
||||||
|
var addedGlobalFileReference = false;
|
||||||
|
forEach(root.referencedFiles, fileReference => {
|
||||||
|
var referencedFile = tryResolveScriptReference(host, root, fileReference);
|
||||||
|
|
||||||
|
// All the references that are not going to be part of same file
|
||||||
|
if (referencedFile && ((referencedFile.flags & NodeFlags.DeclarationFile) || // This is a declare file reference
|
||||||
|
shouldEmitToOwnFile(referencedFile, compilerOptions) || // This is referenced file is emitting its own js file
|
||||||
|
!addedGlobalFileReference)) { // Or the global out file corresponding to this reference was not added
|
||||||
|
|
||||||
|
writeReferencePath(referencedFile);
|
||||||
|
if (!isExternalModuleOrDeclarationFile(referencedFile)) {
|
||||||
|
addedGlobalFileReference = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
emitSourceFile(root);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Emit references corresponding to this file
|
||||||
|
var emittedReferencedFiles: SourceFile[] = [];
|
||||||
|
forEach(host.getSourceFiles(), sourceFile => {
|
||||||
|
if (!isExternalModuleOrDeclarationFile(sourceFile)) {
|
||||||
|
// Check what references need to be added
|
||||||
|
if (!compilerOptions.noResolve) {
|
||||||
|
forEach(sourceFile.referencedFiles, fileReference => {
|
||||||
|
var referencedFile = tryResolveScriptReference(host, sourceFile, fileReference);
|
||||||
|
|
||||||
|
// If the reference file is a declaration file or an external module, emit that reference
|
||||||
|
if (referencedFile && (isExternalModuleOrDeclarationFile(referencedFile) &&
|
||||||
|
!contains(emittedReferencedFiles, referencedFile))) { // If the file reference was not already emitted
|
||||||
|
|
||||||
|
writeReferencePath(referencedFile);
|
||||||
|
emittedReferencedFiles.push(referencedFile);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
emitSourceFile(sourceFile);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
reportedDeclarationError,
|
||||||
|
aliasDeclarationEmitInfo,
|
||||||
|
synchronousDeclarationOutput: writer.getText(),
|
||||||
|
referencePathsOutput,
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasInternalAnnotation(range: CommentRange) {
|
||||||
|
var text = currentSourceFile.text;
|
||||||
|
var comment = text.substring(range.pos, range.end);
|
||||||
|
return comment.indexOf("@internal") >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function stripInternal(node: Node) {
|
||||||
|
if (node) {
|
||||||
|
var leadingCommentRanges = getLeadingCommentRanges(currentSourceFile.text, node.pos);
|
||||||
|
if (forEach(leadingCommentRanges, hasInternalAnnotation)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
emitNode(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function createAndSetNewTextWriterWithSymbolWriter(): EmitTextWriterWithSymbolWriter {
|
function createAndSetNewTextWriterWithSymbolWriter(): EmitTextWriterWithSymbolWriter {
|
||||||
var writer = <EmitTextWriterWithSymbolWriter>createTextWriter(newLine);
|
var writer = <EmitTextWriterWithSymbolWriter>createTextWriter(newLine);
|
||||||
writer.trackSymbol = trackSymbol;
|
writer.trackSymbol = trackSymbol;
|
||||||
|
@ -463,7 +540,7 @@ module ts {
|
||||||
|
|
||||||
function emitLines(nodes: Node[]) {
|
function emitLines(nodes: Node[]) {
|
||||||
for (var i = 0, n = nodes.length; i < n; i++) {
|
for (var i = 0, n = nodes.length; i < n; i++) {
|
||||||
emitNode(nodes[i]);
|
emit(nodes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1402,10 +1479,6 @@ module ts {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Contains the reference paths that needs to go in the declaration file.
|
|
||||||
// Collecting this separately because reference paths need to be first thing in the declaration file
|
|
||||||
// and we could be collecting these paths from multiple files into single one with --out option
|
|
||||||
var referencePathsOutput = "";
|
|
||||||
function writeReferencePath(referencedFile: SourceFile) {
|
function writeReferencePath(referencedFile: SourceFile) {
|
||||||
var declFileName = referencedFile.flags & NodeFlags.DeclarationFile
|
var declFileName = referencedFile.flags & NodeFlags.DeclarationFile
|
||||||
? referencedFile.filename // Declaration file, use declaration file name
|
? referencedFile.filename // Declaration file, use declaration file name
|
||||||
|
@ -1422,60 +1495,6 @@ module ts {
|
||||||
|
|
||||||
referencePathsOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
|
referencePathsOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (root) {
|
|
||||||
// Emitting just a single file, so emit references in this file only
|
|
||||||
if (!compilerOptions.noResolve) {
|
|
||||||
var addedGlobalFileReference = false;
|
|
||||||
forEach(root.referencedFiles, fileReference => {
|
|
||||||
var referencedFile = tryResolveScriptReference(host, root, fileReference);
|
|
||||||
|
|
||||||
// All the references that are not going to be part of same file
|
|
||||||
if (referencedFile && ((referencedFile.flags & NodeFlags.DeclarationFile) || // This is a declare file reference
|
|
||||||
shouldEmitToOwnFile(referencedFile, compilerOptions) || // This is referenced file is emitting its own js file
|
|
||||||
!addedGlobalFileReference)) { // Or the global out file corresponding to this reference was not added
|
|
||||||
|
|
||||||
writeReferencePath(referencedFile);
|
|
||||||
if (!isExternalModuleOrDeclarationFile(referencedFile)) {
|
|
||||||
addedGlobalFileReference = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
emitNode(root);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Emit references corresponding to this file
|
|
||||||
var emittedReferencedFiles: SourceFile[] = [];
|
|
||||||
forEach(host.getSourceFiles(), sourceFile => {
|
|
||||||
if (!isExternalModuleOrDeclarationFile(sourceFile)) {
|
|
||||||
// Check what references need to be added
|
|
||||||
if (!compilerOptions.noResolve) {
|
|
||||||
forEach(sourceFile.referencedFiles, fileReference => {
|
|
||||||
var referencedFile = tryResolveScriptReference(host, sourceFile, fileReference);
|
|
||||||
|
|
||||||
// If the reference file is a declaration file or an external module, emit that reference
|
|
||||||
if (referencedFile && (isExternalModuleOrDeclarationFile(referencedFile) &&
|
|
||||||
!contains(emittedReferencedFiles, referencedFile))) { // If the file reference was not already emitted
|
|
||||||
|
|
||||||
writeReferencePath(referencedFile);
|
|
||||||
emittedReferencedFiles.push(referencedFile);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
emitNode(sourceFile);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
reportedDeclarationError,
|
|
||||||
aliasDeclarationEmitInfo,
|
|
||||||
synchronousDeclarationOutput: writer.getText(),
|
|
||||||
referencePathsOutput,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDeclarationDiagnostics(host: EmitHost, resolver: EmitResolver, targetSourceFile: SourceFile): Diagnostic[] {
|
export function getDeclarationDiagnostics(host: EmitHost, resolver: EmitResolver, targetSourceFile: SourceFile): Diagnostic[] {
|
||||||
|
|
|
@ -413,7 +413,7 @@ module ts {
|
||||||
output += getDiagnosticText(Diagnostics.Options_Colon) + sys.newLine;
|
output += getDiagnosticText(Diagnostics.Options_Colon) + sys.newLine;
|
||||||
|
|
||||||
// Sort our options by their names, (e.g. "--noImplicitAny" comes before "--watch")
|
// Sort our options by their names, (e.g. "--noImplicitAny" comes before "--watch")
|
||||||
var optsList = optionDeclarations.slice();
|
var optsList = filter(optionDeclarations.slice(), v => !v.experimental);
|
||||||
optsList.sort((a, b) => compareValues<string>(a.name.toLowerCase(), b.name.toLowerCase()));
|
optsList.sort((a, b) => compareValues<string>(a.name.toLowerCase(), b.name.toLowerCase()));
|
||||||
|
|
||||||
// We want our descriptions to align at the same column in our output,
|
// We want our descriptions to align at the same column in our output,
|
||||||
|
|
|
@ -1468,6 +1468,7 @@ module ts {
|
||||||
target?: ScriptTarget;
|
target?: ScriptTarget;
|
||||||
version?: boolean;
|
version?: boolean;
|
||||||
watch?: boolean;
|
watch?: boolean;
|
||||||
|
stripInternal?: boolean;
|
||||||
[option: string]: string | number | boolean;
|
[option: string]: string | number | boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1506,6 +1507,7 @@ module ts {
|
||||||
description?: DiagnosticMessage; // The message describing what the command line switch does
|
description?: DiagnosticMessage; // The message describing what the command line switch does
|
||||||
paramType?: DiagnosticMessage; // The name to be used for a non-boolean option's parameter
|
paramType?: DiagnosticMessage; // The name to be used for a non-boolean option's parameter
|
||||||
error?: DiagnosticMessage; // The error given when the argument does not fit a customized 'type'
|
error?: DiagnosticMessage; // The error given when the argument does not fit a customized 'type'
|
||||||
|
experimental?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const enum CharacterCodes {
|
export const enum CharacterCodes {
|
||||||
|
|
|
@ -1017,6 +1017,9 @@ module Harness {
|
||||||
options.removeComments = setting.value === 'false';
|
options.removeComments = setting.value === 'false';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'stripinternal':
|
||||||
|
options.stripInternal = !!setting.value;
|
||||||
|
|
||||||
case 'usecasesensitivefilenames':
|
case 'usecasesensitivefilenames':
|
||||||
useCaseSensitiveFileNames = setting.value === 'true';
|
useCaseSensitiveFileNames = setting.value === 'true';
|
||||||
break;
|
break;
|
||||||
|
@ -1464,7 +1467,7 @@ module Harness {
|
||||||
var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines
|
var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines
|
||||||
|
|
||||||
// List of allowed metadata names
|
// List of allowed metadata names
|
||||||
var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outdir", "noemitonerror", "noimplicitany", "noresolve", "newline", "newlines", "emitbom", "errortruncation", "usecasesensitivefilenames", "preserveconstenums", "includebuiltfile", "suppressimplicitanyindexerrors"];
|
var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outdir", "noemitonerror", "noimplicitany", "noresolve", "newline", "newlines", "emitbom", "errortruncation", "usecasesensitivefilenames", "preserveconstenums", "includebuiltfile", "suppressimplicitanyindexerrors", "stripinternal"];
|
||||||
|
|
||||||
function extractCompilerSettings(content: string): CompilerSetting[] {
|
function extractCompilerSettings(content: string): CompilerSetting[] {
|
||||||
|
|
||||||
|
|
25
tests/baselines/reference/stripInternal1.js
Normal file
25
tests/baselines/reference/stripInternal1.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
//// [stripInternal1.ts]
|
||||||
|
|
||||||
|
class C {
|
||||||
|
foo(): void { }
|
||||||
|
// @internal
|
||||||
|
bar(): void { }
|
||||||
|
}
|
||||||
|
|
||||||
|
//// [stripInternal1.js]
|
||||||
|
var C = (function () {
|
||||||
|
function C() {
|
||||||
|
}
|
||||||
|
C.prototype.foo = function () {
|
||||||
|
};
|
||||||
|
// @internal
|
||||||
|
C.prototype.bar = function () {
|
||||||
|
};
|
||||||
|
return C;
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
//// [stripInternal1.d.ts]
|
||||||
|
declare class C {
|
||||||
|
foo(): void;
|
||||||
|
}
|
12
tests/baselines/reference/stripInternal1.types
Normal file
12
tests/baselines/reference/stripInternal1.types
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
=== tests/cases/compiler/stripInternal1.ts ===
|
||||||
|
|
||||||
|
class C {
|
||||||
|
>C : C
|
||||||
|
|
||||||
|
foo(): void { }
|
||||||
|
>foo : () => void
|
||||||
|
|
||||||
|
// @internal
|
||||||
|
bar(): void { }
|
||||||
|
>bar : () => void
|
||||||
|
}
|
8
tests/cases/compiler/stripInternal1.ts
Normal file
8
tests/cases/compiler/stripInternal1.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
// @declaration:true
|
||||||
|
// @stripInternal:true
|
||||||
|
|
||||||
|
class C {
|
||||||
|
foo(): void { }
|
||||||
|
// @internal
|
||||||
|
bar(): void { }
|
||||||
|
}
|
Loading…
Reference in a new issue