Index: com/google/javascript/rhino/JSDocInfo.java =================================================================== --- com/google/javascript/rhino/JSDocInfo.java (revision 9) +++ com/google/javascript/rhino/JSDocInfo.java (working copy) @@ -214,9 +214,18 @@ private static final int MASK_NOSHADOW = 0x00000800; // @noshadow private static final int MASK_FILEOVERVIEW = 0x00001000; // @fileoverview private static final int MASK_IMPLICITCAST = 0x00002000; // @implicitCast - private static final int MASK_NOSIDEEFFECTS = 0x00004000; // @nosideeffects + private static final int MASK_NOSIDEEFFECTS = 0x00004000; // @nosideeffects + private static final int MASK_STRIP = 0x00008000; // @nosideeffects - // 3 bit type field stored in the top 3 bits of the most significant + void setStrip(boolean value) { + setFlag(value, MASK_STRIP); + } + + public boolean isStrip() { + return getFlag(MASK_STRIP); + } + + // 3 bit type field stored in the top 3 bits of the most significant // nibble. private static final int MASK_TYPEFIELD = 0xE0000000; // 1110... private static final int TYPEFIELD_TYPE = 0x20000000; // 0010... Index: com/google/javascript/rhino/JSDocInfoBuilder.java =================================================================== --- com/google/javascript/rhino/JSDocInfoBuilder.java (revision 9) +++ com/google/javascript/rhino/JSDocInfoBuilder.java (working copy) @@ -657,7 +657,18 @@ } } - /** + public boolean recordStrip() { + if (!currentInfo.isStrip()) { + currentInfo.setStrip(true); + populated = true; + return true; + } else { + return false; + } + } + + + /** * Records that the {@link JSDocInfo} being built should have its * {@link JSDocInfo#isExport()} flag set to {@code true}. */ Index: com/google/javascript/jscomp/DefaultPassConfig.java =================================================================== --- com/google/javascript/jscomp/DefaultPassConfig.java (revision 9) +++ com/google/javascript/jscomp/DefaultPassConfig.java (working copy) @@ -195,6 +195,9 @@ // Defines in code always need to be processed. checks.add(processDefines); + + checks.add(applyAnnotationStrip); + assertAllOneTimePasses(checks); return checks; } @@ -636,6 +639,14 @@ } }; + private final PassFactory applyAnnotationStrip = + new PassFactory("applyAnnotationStrip", true) { + @Override + protected CompilerPass createInternal(AbstractCompiler compiler) { + return new ApplyAnnotationStrip((Compiler)compiler); + } + }; + /** Checks type usage */ private final PassFactory checkTypes = new PassFactory("checkTypes", false) { Index: com/google/javascript/jscomp/ApplyAnnotationStrip.java =================================================================== --- com/google/javascript/jscomp/ApplyAnnotationStrip.java (revision 0) +++ com/google/javascript/jscomp/ApplyAnnotationStrip.java (revision 0) @@ -0,0 +1,42 @@ +package com.google.javascript.jscomp; + +import com.google.common.collect.Sets; +import com.google.javascript.rhino.Node; +import com.google.javascript.rhino.Token; +import com.google.javascript.rhino.JSDocInfo; +import com.google.javascript.rhino.FunctionNode; + +class ApplyAnnotationStrip extends NodeTraversal.AbstractPostOrderCallback implements CompilerPass { + + private final Compiler compiler; + + ApplyAnnotationStrip(Compiler compiler) { + this.compiler = compiler; + } + + public void visit(NodeTraversal t, Node n, Node parent) { + JSDocInfo jsDocInfo = n.getJSDocInfo(); + + if (jsDocInfo == null || !jsDocInfo.isStrip()) return; + + /* получить имя объекта/функции */ + String name = null; + if (n.getType() == Token.FUNCTION) { + name = ((FunctionNode)n).getFunctionName(); + } else if (n.getType() == Token.ASSIGN) { + name = n.getFirstChild().getQualifiedName(); + } + + /* добавить в список */ + CompilerOptions options = compiler.getOptions(); + if (options.stripTypes.isEmpty()) { + options.stripTypes = Sets.newHashSet(); + } + options.stripTypes.add(name); + } + + public void process(Node externs, Node root) { + NodeTraversal.traverse(compiler, root, this); + } + +} Index: com/google/javascript/jscomp/parsing/JsDocInfoParser.java =================================================================== --- com/google/javascript/jscomp/parsing/JsDocInfoParser.java (revision 9) +++ com/google/javascript/jscomp/parsing/JsDocInfoParser.java (working copy) @@ -79,6 +79,7 @@ put("desc", Annotation.DESC). put("enum", Annotation.ENUM). put("export", Annotation.EXPORT). + put("strip", Annotation.STRIP). put("extends", Annotation.EXTENDS). put("fileoverview", Annotation.FILE_OVERVIEW). put("final", Annotation.CONSTANT). @@ -152,6 +153,7 @@ ENUM, EXTENDS, EXPORT, + STRIP, FILE_OVERVIEW, HIDDEN, IMPLEMENTS, @@ -415,6 +417,14 @@ token = eatTokensUntilEOL(); continue retry; + case STRIP: + if (!jsdocBuilder.recordStrip()) { + parser.addWarning("msg.jsdoc.strip", + stream.getLineno(), stream.getCharno()); + } + token = eatTokensUntilEOL(); + continue retry; + case EXTENDS: case IMPLEMENTS: skipEOLs();