Skip to content

Commit

Permalink
Provide an experimental flag that allows us to emit declarations exce…
Browse files Browse the repository at this point in the history
…pt for nodes marked with '@internal'.
  • Loading branch information
CyrusNajmabadi committed Feb 3, 2015
1 parent 0ca0304 commit 838b9b6
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 5 deletions.
6 changes: 6 additions & 0 deletions src/compiler/commandLineParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions src/compiler/diagnosticInformationMap.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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." },
Expand Down
4 changes: 4 additions & 0 deletions src/compiler/diagnosticMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
24 changes: 21 additions & 3 deletions src/compiler/emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = [];

Expand Down Expand Up @@ -383,7 +384,7 @@ module ts {
});
}

emitNode(root);
emitSourceFile(root);
}
else {
// Emit references corresponding to this file
Expand All @@ -405,7 +406,7 @@ module ts {
});
}

emitNode(sourceFile);
emitSourceFile(sourceFile);
}
});
}
Expand All @@ -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;
Expand Down Expand Up @@ -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]);
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/compiler/tsc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions src/compiler/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1476,6 +1476,7 @@ module ts {
target?: ScriptTarget;
version?: boolean;
watch?: boolean;
stripInternal?: boolean;
[option: string]: string | number | boolean;
}

Expand Down Expand Up @@ -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 {
Expand Down
5 changes: 4 additions & 1 deletion src/harness/harness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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[] {

Expand Down
25 changes: 25 additions & 0 deletions tests/baselines/reference/stripInternal1.js
Original file line number Diff line number Diff line change
@@ -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 changes: 12 additions & 0 deletions tests/baselines/reference/stripInternal1.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
=== tests/cases/compiler/stripInternal1.ts ===

class C {
>C : C

foo(): void { }
>foo : () => void

// @internal
bar(): void { }
>bar : () => void
}
8 changes: 8 additions & 0 deletions tests/cases/compiler/stripInternal1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// @declaration:true
// @stripInternal:true

class C {
foo(): void { }
// @internal
bar(): void { }
}

0 comments on commit 838b9b6

Please sign in to comment.