From 6a51bc8f71b37a68019d05d9e114c648a63fe863 Mon Sep 17 00:00:00 2001 From: blickly Date: Tue, 15 May 2018 12:08:55 -0700 Subject: [PATCH] Output @externs annotation in the @fileoverview block when printing externs files ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=196708182 --- .../javascript/jscomp/CodeGenerator.java | 5 ----- .../google/javascript/jscomp/CodePrinter.java | 14 -------------- .../google/javascript/jscomp/Compiler.java | 1 - .../javascript/jscomp/JSDocInfoPrinter.java | 7 +++++++ .../jscomp/parsing/JsDocInfoParser.java | 7 +++++++ .../javascript/jscomp/CodePrinterTest.java | 6 ------ .../javascript/jscomp/CompilerTest.java | 5 +++-- .../jscomp/JSDocInfoPrinterTest.java | 19 ++++++++++++++++++- 8 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/com/google/javascript/jscomp/CodeGenerator.java b/src/com/google/javascript/jscomp/CodeGenerator.java index 33b4001dcbb..bbcf23620f9 100644 --- a/src/com/google/javascript/jscomp/CodeGenerator.java +++ b/src/com/google/javascript/jscomp/CodeGenerator.java @@ -83,11 +83,6 @@ void tagAsTypeSummary() { add("/** @fileoverview @typeSummary */\n"); } - /** Insert a top-level @externs comment. */ - public void tagAsExterns() { - add("/** @externs */\n"); - } - /** * Insert a ECMASCRIPT 5 strict annotation. */ diff --git a/src/com/google/javascript/jscomp/CodePrinter.java b/src/com/google/javascript/jscomp/CodePrinter.java index 5b2540c0794..235de023e4e 100644 --- a/src/com/google/javascript/jscomp/CodePrinter.java +++ b/src/com/google/javascript/jscomp/CodePrinter.java @@ -705,7 +705,6 @@ public static final class Builder { private boolean prettyPrint; private boolean outputTypes = false; private SourceMap sourceMap = null; - private boolean tagAsExterns; private boolean tagAsTypeSummary; private boolean tagAsStrict; private JSTypeRegistry registry; @@ -785,14 +784,6 @@ public Builder setTagAsTypeSummary(boolean tagAsTypeSummary) { return this; } - /** - * Set whether the output should be tagged as @externs code. - */ - public Builder setTagAsExterns(boolean tagAsExterns) { - this.tagAsExterns = tagAsExterns; - return this; - } - /** * Set whether the output should be tags as ECMASCRIPT 5 Strict. */ @@ -828,7 +819,6 @@ public String build() { options, sourceMap, tagAsTypeSummary, - tagAsExterns, tagAsStrict, lineBreak, codeGeneratorFactory); @@ -861,7 +851,6 @@ private static String toSource( CompilerOptions options, SourceMap sourceMap, boolean tagAsTypeSummary, - boolean tagAsExterns, boolean tagAsStrict, boolean lineBreak, CodeGeneratorFactory codeGeneratorFactory) { @@ -882,9 +871,6 @@ private static String toSource( options.sourceMapDetailLevel); CodeGenerator cg = codeGeneratorFactory.getCodeGenerator(outputFormat, mcp); - if (tagAsExterns) { - cg.tagAsExterns(); - } if (tagAsTypeSummary) { cg.tagAsTypeSummary(); } diff --git a/src/com/google/javascript/jscomp/Compiler.java b/src/com/google/javascript/jscomp/Compiler.java index cdef73acb82..5e9f63592c5 100644 --- a/src/com/google/javascript/jscomp/Compiler.java +++ b/src/com/google/javascript/jscomp/Compiler.java @@ -2320,7 +2320,6 @@ private String toSource(Node n, SourceMap sourceMap, boolean firstOutput) { builder.setTypeRegistry(getTypeRegistry()); builder.setCompilerOptions(options); builder.setSourceMap(sourceMap); - builder.setTagAsExterns(n.isFromExterns()); builder.setTagAsTypeSummary(!n.isFromExterns() && options.shouldGenerateTypedExterns()); builder.setTagAsStrict(firstOutput && options.shouldEmitUseStrict()); return builder.build(); diff --git a/src/com/google/javascript/jscomp/JSDocInfoPrinter.java b/src/com/google/javascript/jscomp/JSDocInfoPrinter.java index 5d33d6e1c49..e0f83fe729d 100644 --- a/src/com/google/javascript/jscomp/JSDocInfoPrinter.java +++ b/src/com/google/javascript/jscomp/JSDocInfoPrinter.java @@ -49,6 +49,7 @@ public String print(JSDocInfo info) { List parts = new ArrayList<>(); // order: + // externs|typeSummary // export|public|private|package|protected // abstract // lends @@ -75,6 +76,12 @@ public String print(JSDocInfo info) { // mixinFunction parts.add("/**"); + if (info.isExterns()) { + parts.add("@externs"); + } else if (info.isTypeSummary()) { + parts.add("@typeSummary"); + } + if (info.isExport()) { parts.add("@export"); } else if (info.getVisibility() != null diff --git a/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java b/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java index 47a018d8720..79f054f296d 100644 --- a/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java +++ b/src/com/google/javascript/jscomp/parsing/JsDocInfoParser.java @@ -237,6 +237,13 @@ public static JSDocInfo parseJsdoc(String toParse) { return parser.retrieveAndResetParsedJSDocInfo(); } + @VisibleForTesting + public static JSDocInfo parseFileOverviewJsdoc(String toParse) { + JsDocInfoParser parser = getParser(toParse); + parser.parse(); + return parser.getFileOverviewJSDocInfo(); + } + private static JsDocInfoParser getParser(String toParse) { Config config = Config.builder() diff --git a/test/com/google/javascript/jscomp/CodePrinterTest.java b/test/com/google/javascript/jscomp/CodePrinterTest.java index d05cf115075..1a39b76a89a 100644 --- a/test/com/google/javascript/jscomp/CodePrinterTest.java +++ b/test/com/google/javascript/jscomp/CodePrinterTest.java @@ -2005,12 +2005,6 @@ public void testStrictPretty() { assertThat(result).isEqualTo("'use strict';\nvar x;\n"); } - public void testExterns() { - String result = - defaultBuilder(parse("var x", /* typeChecked= */ true)).setTagAsExterns(true).build(); - assertEquals("/** @externs */\nvar x", result); - } - public void testIjs() { String result = defaultBuilder(parse("var x", /* typeChecked= */ true)) diff --git a/test/com/google/javascript/jscomp/CompilerTest.java b/test/com/google/javascript/jscomp/CompilerTest.java index b0fe3cf3ada..de6256d3a0e 100644 --- a/test/com/google/javascript/jscomp/CompilerTest.java +++ b/test/com/google/javascript/jscomp/CompilerTest.java @@ -112,14 +112,15 @@ public void testCyclicalDependencyInInputs() { public void testPrintExterns() { List externs = - ImmutableList.of(SourceFile.fromCode("extern", "function alert(x) {}")); + ImmutableList.of(SourceFile.fromCode("extern", "/** @externs */ function alert(x) {}")); CompilerOptions options = new CompilerOptions(); + options.setPreserveTypeAnnotations(true); options.setLanguageIn(LanguageMode.ECMASCRIPT3); options.setPrintExterns(true); Compiler compiler = new Compiler(); compiler.init(externs, ImmutableList.of(), options); compiler.parseInputs(); - assertThat(compiler.toSource()).isEqualTo("/** @externs */\nfunction alert(x){};"); + assertThat(compiler.toSource()).isEqualTo("/** @externs */ function alert(x){};"); } public void testLocalUndefined() throws Exception { diff --git a/test/com/google/javascript/jscomp/JSDocInfoPrinterTest.java b/test/com/google/javascript/jscomp/JSDocInfoPrinterTest.java index 50ebc21bdde..5aa249ad4fd 100644 --- a/test/com/google/javascript/jscomp/JSDocInfoPrinterTest.java +++ b/test/com/google/javascript/jscomp/JSDocInfoPrinterTest.java @@ -27,6 +27,7 @@ import com.google.javascript.rhino.JSTypeExpression; import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Token; +import java.util.function.Function; import junit.framework.TestCase; /** @@ -340,6 +341,14 @@ public void testDeprecated() { jsDocInfoPrinter.print(info)); } + public void testExterns() { + testSameFileoverview("/** @externs */ "); + } + + public void testTypeSummary() { + testSameFileoverview("/** @typeSummary */ "); + } + public void testExport() { testSame("/** @export */ "); } @@ -360,10 +369,18 @@ private void testSame(String jsdoc) { test(jsdoc, jsdoc); } + private void testSameFileoverview(String jsdoc) { + test(jsdoc, jsdoc, JsDocInfoParser::parseFileOverviewJsdoc); + } + private void test(String input, String output) { + test(input, output, JsDocInfoParser::parseJsdoc); + } + + private void test(String input, String output, Function parser) { assertThat(input).startsWith("/**"); String contents = input.substring("/**".length()); - JSDocInfo info = JsDocInfoParser.parseJsdoc(contents); + JSDocInfo info = parser.apply(contents); assertNotNull("Parse error on parsing JSDoc: " + input, info); assertThat(jsDocInfoPrinter.print(info)).isEqualTo(output); }