Provide an experimental flag that allows us to emit declarations except for nodes marked with '@internal'.

This commit is contained in:
Cyrus Najmabadi
2015-02-03 13:15:28 -08:00
parent 0ca03048cf
commit 838b9b6998
10 changed files with 84 additions and 5 deletions

View File

@@ -134,6 +134,12 @@ module ts {
type: "boolean",
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",
shortName: "t",

View File

@@ -433,6 +433,7 @@ module ts {
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'." },
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." },
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." },

View File

@@ -1725,6 +1725,10 @@
"category": "Message",
"code": 6055
},
"Do not emit declarations for code that has an '@internal' annotation.": {
"category": "Message",
"code": 6056
},
"Variable '{0}' implicitly has an '{1}' type.": {
"category": "Error",

View File

@@ -355,6 +355,7 @@ module ts {
var reportedDeclarationError = false;
var emitJsDocComments = compilerOptions.removeComments ? function (declaration: Node) { } : writeJsDocComments;
var emit = compilerOptions.stripInternal ? stripInternal : emitNode;
var aliasDeclarationEmitInfo: AliasDeclarationEmitInfo[] = [];
@@ -383,7 +384,7 @@ module ts {
});
}
emitNode(root);
emitSourceFile(root);
}
else {
// Emit references corresponding to this file
@@ -405,7 +406,7 @@ module ts {
});
}
emitNode(sourceFile);
emitSourceFile(sourceFile);
}
});
}
@@ -417,6 +418,23 @@ module ts {
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 {
var writer = <EmitTextWriterWithSymbolWriter>createTextWriter(newLine);
writer.trackSymbol = trackSymbol;
@@ -522,7 +540,7 @@ module ts {
function emitLines(nodes: Node[]) {
for (var i = 0, n = nodes.length; i < n; i++) {
emitNode(nodes[i]);
emit(nodes[i]);
}
}

View File

@@ -413,7 +413,7 @@ module ts {
output += getDiagnosticText(Diagnostics.Options_Colon) + sys.newLine;
// 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()));
// We want our descriptions to align at the same column in our output,

View File

@@ -1476,6 +1476,7 @@ module ts {
target?: ScriptTarget;
version?: boolean;
watch?: boolean;
stripInternal?: boolean;
[option: string]: string | number | boolean;
}
@@ -1514,6 +1515,7 @@ module ts {
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
error?: DiagnosticMessage; // The error given when the argument does not fit a customized 'type'
experimental?: boolean;
}
export const enum CharacterCodes {

View File

@@ -1015,6 +1015,9 @@ module Harness {
options.removeComments = setting.value === 'false';
break;
case 'stripinternal':
options.stripInternal = !!setting.value;
case 'usecasesensitivefilenames':
useCaseSensitiveFileNames = setting.value === 'true';
break;
@@ -1454,7 +1457,7 @@ module Harness {
var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines
// 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[] {

View 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;
}

View File

@@ -0,0 +1,12 @@
=== tests/cases/compiler/stripInternal1.ts ===
class C {
>C : C
foo(): void { }
>foo : () => void
// @internal
bar(): void { }
>bar : () => void
}

View File

@@ -0,0 +1,8 @@
// @declaration:true
// @stripInternal:true
class C {
foo(): void { }
// @internal
bar(): void { }
}