diff --git a/lib/tsc.js b/lib/tsc.js index 6b8181ca9e483b14535154afc5848ac9742a4f41..74fd2d717398aff347847075db1cdf4cb7a83717 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -9923,6 +9923,12 @@ var ts; } } ts.getDecorators = getDecorators; + function getAnnotations(node) { + if (ts.hasAnnotations(node)) { + return ts.filter(node.modifiers, ts.isAnnotation); + } + } + ts.getAnnotations = getAnnotations; function getModifiers(node) { if (ts.hasSyntacticModifier(node, 126975)) { return ts.filter(node.modifiers, isModifier); @@ -10528,7 +10534,7 @@ var ts; } ts.isNamedClassElement = isNamedClassElement; function isModifierLike(node) { - return isModifier(node) || ts.isDecorator(node); + return isModifier(node) || ts.isDecoratorOrAnnotation(node); } ts.isModifierLike = isModifierLike; function isTypeElement(node) { @@ -23899,6 +23905,10 @@ var ts; return node.kind === 168; } ts.isParameter = isParameter; + function isDecoratorOrAnnotation(node) { + return node.kind === 169; + } + ts.isDecoratorOrAnnotation = isDecoratorOrAnnotation; function isDecorator(node) { return node.kind === 169 && node.annotationDeclaration === undefined; } @@ -38945,32 +38955,37 @@ var ts; if (node.isDeclarationFile) { return node; } - var updatedSource = ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotationsDeclarations, context)); - return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(updatedSource.statements, visitAnnotations, context)); + return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotations, context)); } - function visitAnnotationsDeclarations(node) { + function visitAnnotations(node) { switch (node.kind) { case 266: return visitAnnotationDeclaration(node); - default: - return ts.visitEachChild(node, visitAnnotationsDeclarations, context); - } - } - function visitAnnotations(node) { - switch (node.kind) { + case 279: + return visitImportSpecifier(node); case 169: return visitAnnotation(node); default: return ts.visitEachChild(node, visitAnnotations, context); } } + function visitImportSpecifier(node) { + if (node.isTypeOnly || !resolver.isReferredToAnnotation(node)) { + return node; + } + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); + return ts.factory.updateImportSpecifier(node, node.isTypeOnly, node.propertyName, magicPrefixName); + } function visitAnnotationDeclaration(node) { + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); var members = node.members.map(function (node) { var type = resolver.getAnnotationPropertyInferredType(node); var initializer = resolver.getAnnotationPropertyEvaluatedInitializer(node); return ts.factory.updateAnnotationPropertyDeclaration(node, node.name, type, initializer); }); - return ts.factory.updateAnnotationDeclaration(node, node.modifiers, node.name, members); + return ts.factory.updateAnnotationDeclaration(node, node.modifiers, magicPrefixName, members); } function visitAnnotation(node) { if (!node.annotationDeclaration) { @@ -38984,7 +38999,7 @@ var ts; return ts.factory.createIdentifier(ts.annotationMagicNamePrefix + expr.escapedText); case 211: var propAccessExpr = expr; - return ts.factory.updatePropertyAccessExpression(propAccessExpr, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.expression), propAccessExpr.name); + return ts.factory.updatePropertyAccessExpression(propAccessExpr, propAccessExpr.expression, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.name)); case 213: var callExpr = expr; return ts.factory.updateCallExpression(callExpr, addMagicPrefixToAnnotationNameIdentifier(callExpr.expression), callExpr.typeArguments, callExpr.arguments); @@ -49306,6 +49321,7 @@ var ts; case 263: case 269: case 274: + case 266: if (ts.isExternalModuleAugmentation(node)) { return true; } @@ -82736,7 +82752,7 @@ var ts; } } function modifierVisitor(node) { - if (ts.isDecorator(node)) + if (ts.isDecoratorOrAnnotation(node)) return undefined; if (ts.modifierToFlag(node.kind) & 117086) { return undefined; @@ -94961,6 +94977,7 @@ var ts; case 265: case 268: case 269: + case 266: return !resolver.isDeclarationVisible(node); case 261: return !getBindingNameVisible(node); @@ -95214,7 +95231,12 @@ var ts; if (ts.isPrivateIdentifier(input.name)) { return cleanup(undefined); } - var reservedDecorators_1 = ts.getReservedDecoratorsOfStructDeclaration(input, host); + var reservedDecorators_1 = ts.concatenate(ts.getReservedDecoratorsOfStructDeclaration(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators_1, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); var sig = factory.createMethodDeclaration(ts.concatenateDecoratorsAndModifiers(reservedDecorators_1, ensureModifiers(input)), undefined, input.name, input.questionToken, ts.inEtsStylesContext(input, host) ? undefined : ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), undefined); return cleanup(sig); } @@ -95600,8 +95622,12 @@ var ts; } else { var heritageClauses = transformHeritageClauses(input.heritageClauses); - var reservedDecorators = ts.getReservedDecoratorsOfEtsFile(input, host); - ; + var reservedDecorators = ts.concatenate(ts.getReservedDecoratorsOfEtsFile(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); return cleanup(factory.updateClassDeclaration(input, ts.concatenateDecoratorsAndModifiers(reservedDecorators, modifiers), input.name, typeParameters, heritageClauses, members)); } } @@ -99830,7 +99856,7 @@ var ts; if (ts.every(modifiers, ts.isModifier)) { return emitModifiers(node, modifiers); } - if (ts.every(modifiers, ts.isDecorator)) { + if (ts.every(modifiers, ts.isDecoratorOrAnnotation)) { return emitDecorators(node, modifiers); } onBeforeEmitNodeArray === null || onBeforeEmitNodeArray === void 0 ? void 0 : onBeforeEmitNodeArray(modifiers); @@ -99841,7 +99867,7 @@ var ts; while (start < modifiers.length) { while (pos < modifiers.length) { var modifier = modifiers[pos]; - mode = ts.isDecorator(modifier) ? "decorators" : "modifiers"; + mode = ts.isDecoratorOrAnnotation(modifier) ? "decorators" : "modifiers"; if (lastMode === undefined) { lastMode = mode; } diff --git a/lib/tsserver.js b/lib/tsserver.js index f59533126395a34a5cf54ddcb9bd6b1230d954c1..53be5ea5d80671ee266d16aa6e6a9dc0ac21d802 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -13193,6 +13193,12 @@ var ts; } } ts.getDecorators = getDecorators; + function getAnnotations(node) { + if (ts.hasAnnotations(node)) { + return ts.filter(node.modifiers, ts.isAnnotation); + } + } + ts.getAnnotations = getAnnotations; function getModifiers(node) { if (ts.hasSyntacticModifier(node, 126975 /* ModifierFlags.Modifier */)) { return ts.filter(node.modifiers, isModifier); @@ -13946,7 +13952,7 @@ var ts; ts.isNamedClassElement = isNamedClassElement; // Type members function isModifierLike(node) { - return isModifier(node) || ts.isDecorator(node); + return isModifier(node) || ts.isDecoratorOrAnnotation(node); } ts.isModifierLike = isModifierLike; function isTypeElement(node) { @@ -29754,6 +29760,10 @@ var ts; return node.kind === 168 /* SyntaxKind.Parameter */; } ts.isParameter = isParameter; + function isDecoratorOrAnnotation(node) { + return node.kind === 169 /* SyntaxKind.Decorator */; + } + ts.isDecoratorOrAnnotation = isDecoratorOrAnnotation; function isDecorator(node) { return node.kind === 169 /* SyntaxKind.Decorator */ && node.annotationDeclaration === undefined; } @@ -47281,28 +47291,37 @@ var ts; if (node.isDeclarationFile) { return node; } - // Firstly, visit declarations - var updatedSource = ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotationsDeclarations, context)); - // Secondly, visit usage of annotations - return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(updatedSource.statements, visitAnnotations, context)); + // visit declarations, import and usage of annotations + return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotations, context)); } - function visitAnnotationsDeclarations(node) { + function visitAnnotations(node) { switch (node.kind) { case 266 /* SyntaxKind.AnnotationDeclaration */: return visitAnnotationDeclaration(node); - default: - return ts.visitEachChild(node, visitAnnotationsDeclarations, context); - } - } - function visitAnnotations(node) { - switch (node.kind) { + case 279 /* SyntaxKind.ImportSpecifier */: + return visitImportSpecifier(node); case 169 /* SyntaxKind.Decorator */: return visitAnnotation(node); default: return ts.visitEachChild(node, visitAnnotations, context); } } + function visitImportSpecifier(node) { + // Return if the import has type or not refered to Annotation + if (node.isTypeOnly || !resolver.isReferredToAnnotation(node)) { + return node; + } + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); + // Add magic prefix for import Annotation. For example, + // import {Anno} from "xxx" ---> import {__$$ETS_ANNOTATION$$__Anno} from "xxx" + return ts.factory.updateImportSpecifier(node, node.isTypeOnly, node.propertyName, magicPrefixName); + } function visitAnnotationDeclaration(node) { + // Add magic prefix for AnnotationDeclaration. For example, + // @interface Anno {} ---> @interface __$$ETS_ANNOTATION$$__Anno {} + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); // Add explicit type annotation and initializer. For example, // @interface Anno { // a = 10 + 5 @@ -47310,7 +47329,7 @@ var ts; // // will be transformed to // - // @interface Anno { + // @interface __$$ETS_ANNOTATION$$__Anno { // a: number = 15 // } var members = node.members.map(function (node) { @@ -47318,7 +47337,7 @@ var ts; var initializer = resolver.getAnnotationPropertyEvaluatedInitializer(node); return ts.factory.updateAnnotationPropertyDeclaration(node, node.name, type, initializer); }); - return ts.factory.updateAnnotationDeclaration(node, node.modifiers, node.name, members); + return ts.factory.updateAnnotationDeclaration(node, node.modifiers, magicPrefixName, members); } function visitAnnotation(node) { if (!node.annotationDeclaration) { @@ -47336,7 +47355,7 @@ var ts; // and // // Add the magic prefix for annotation name. For example, - // @myModule.Anno({a: 10, b: "abc"}) --- > @#myModule.Anno({a: 10, b: "abc"}) + // @myModule.Anno({a: 10, b: "abc"}) --- > @myModule.__$$ETS_ANNOTATION$$__Anno({a: 10, b: "abc"}) return ts.factory.updateDecorator(node, addMagicPrefixToAnnotationNameIdentifier(addDefaultValuesIntoAnnotationObjectLiteral(node))); } function addMagicPrefixToAnnotationNameIdentifier(expr) { @@ -47345,7 +47364,7 @@ var ts; return ts.factory.createIdentifier(ts.annotationMagicNamePrefix + expr.escapedText); case 211 /* SyntaxKind.PropertyAccessExpression */: var propAccessExpr = expr; - return ts.factory.updatePropertyAccessExpression(propAccessExpr, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.expression), propAccessExpr.name); + return ts.factory.updatePropertyAccessExpression(propAccessExpr, propAccessExpr.expression, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.name)); case 213 /* SyntaxKind.CallExpression */: var callExpr = expr; return ts.factory.updateCallExpression(callExpr, addMagicPrefixToAnnotationNameIdentifier(callExpr.expression), callExpr.typeArguments, callExpr.arguments); @@ -59389,6 +59408,7 @@ var ts; case 263 /* SyntaxKind.FunctionDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: case 274 /* SyntaxKind.ImportEqualsDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: // external module augmentation is always visible if (ts.isExternalModuleAugmentation(node)) { return true; @@ -97908,7 +97928,7 @@ var ts; } } function modifierVisitor(node) { - if (ts.isDecorator(node)) + if (ts.isDecoratorOrAnnotation(node)) return undefined; if (ts.modifierToFlag(node.kind) & 117086 /* ModifierFlags.TypeScriptModifier */) { return undefined; @@ -115094,6 +115114,7 @@ var ts; case 265 /* SyntaxKind.StructDeclaration */: case 268 /* SyntaxKind.TypeAliasDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: return !resolver.isDeclarationVisible(node); // The following should be doing their own visibility checks based on filtering their members case 261 /* SyntaxKind.VariableDeclaration */: @@ -115388,7 +115409,12 @@ var ts; if (ts.isPrivateIdentifier(input.name)) { return cleanup(/*returnValue*/ undefined); } - var reservedDecorators_1 = ts.getReservedDecoratorsOfStructDeclaration(input, host); + var reservedDecorators_1 = ts.concatenate(ts.getReservedDecoratorsOfStructDeclaration(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators_1, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); var sig = factory.createMethodDeclaration(ts.concatenateDecoratorsAndModifiers(reservedDecorators_1, ensureModifiers(input)), /*asteriskToken*/ undefined, input.name, input.questionToken, ts.inEtsStylesContext(input, host) ? undefined : ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), /*body*/ undefined); @@ -115815,8 +115841,12 @@ var ts; } else { var heritageClauses = transformHeritageClauses(input.heritageClauses); - var reservedDecorators = ts.getReservedDecoratorsOfEtsFile(input, host); - ; + var reservedDecorators = ts.concatenate(ts.getReservedDecoratorsOfEtsFile(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); return cleanup(factory.updateClassDeclaration(input, ts.concatenateDecoratorsAndModifiers(reservedDecorators, modifiers), input.name, typeParameters, heritageClauses, members)); } } @@ -120425,7 +120455,7 @@ var ts; // if all modifier-likes are `Modifier`, simply emit the array as modifiers. return emitModifiers(node, modifiers); } - if (ts.every(modifiers, ts.isDecorator)) { + if (ts.every(modifiers, ts.isDecoratorOrAnnotation)) { // if all modifier-likes are `Decorator`, simply emit the array as decorators. return emitDecorators(node, modifiers); } @@ -120438,7 +120468,7 @@ var ts; while (start < modifiers.length) { while (pos < modifiers.length) { var modifier = modifiers[pos]; - mode = ts.isDecorator(modifier) ? "decorators" : "modifiers"; + mode = ts.isDecoratorOrAnnotation(modifier) ? "decorators" : "modifiers"; if (lastMode === undefined) { lastMode = mode; } diff --git a/lib/tsserverlibrary.d.ts b/lib/tsserverlibrary.d.ts index f6d24576d82d96fbab9b562528a665fda51fc13c..f9cc3adccbc9f24d2f64ea3d6dcc5a1fe9a60832 100644 --- a/lib/tsserverlibrary.d.ts +++ b/lib/tsserverlibrary.d.ts @@ -4789,6 +4789,7 @@ declare namespace ts { function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; + function getAnnotations(node: HasDecorators): readonly Decorator[] | undefined; function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; function getAllDecorators(node: Node | undefined): readonly Decorator[]; function getIllegalDecorators(node: HasIllegalDecorators): readonly Decorator[] | undefined; @@ -5082,6 +5083,7 @@ declare namespace ts { function isComputedPropertyName(node: Node): node is ComputedPropertyName; function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; + function isDecoratorOrAnnotation(node: Node): node is Decorator; function isDecorator(node: Node): node is Decorator; function isAnnotation(node: Node): node is Annotation; function isPropertySignature(node: Node): node is PropertySignature; diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index f1503e3e90ac77e64947ad5257b3f2d4f83bcef3..2ba2438d36b81ce2ba5d66d5170aed7308c79f16 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -13192,6 +13192,12 @@ var ts; } } ts.getDecorators = getDecorators; + function getAnnotations(node) { + if (ts.hasAnnotations(node)) { + return ts.filter(node.modifiers, ts.isAnnotation); + } + } + ts.getAnnotations = getAnnotations; function getModifiers(node) { if (ts.hasSyntacticModifier(node, 126975 /* ModifierFlags.Modifier */)) { return ts.filter(node.modifiers, isModifier); @@ -13945,7 +13951,7 @@ var ts; ts.isNamedClassElement = isNamedClassElement; // Type members function isModifierLike(node) { - return isModifier(node) || ts.isDecorator(node); + return isModifier(node) || ts.isDecoratorOrAnnotation(node); } ts.isModifierLike = isModifierLike; function isTypeElement(node) { @@ -29753,6 +29759,10 @@ var ts; return node.kind === 168 /* SyntaxKind.Parameter */; } ts.isParameter = isParameter; + function isDecoratorOrAnnotation(node) { + return node.kind === 169 /* SyntaxKind.Decorator */; + } + ts.isDecoratorOrAnnotation = isDecoratorOrAnnotation; function isDecorator(node) { return node.kind === 169 /* SyntaxKind.Decorator */ && node.annotationDeclaration === undefined; } @@ -47280,28 +47290,37 @@ var ts; if (node.isDeclarationFile) { return node; } - // Firstly, visit declarations - var updatedSource = ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotationsDeclarations, context)); - // Secondly, visit usage of annotations - return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(updatedSource.statements, visitAnnotations, context)); + // visit declarations, import and usage of annotations + return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotations, context)); } - function visitAnnotationsDeclarations(node) { + function visitAnnotations(node) { switch (node.kind) { case 266 /* SyntaxKind.AnnotationDeclaration */: return visitAnnotationDeclaration(node); - default: - return ts.visitEachChild(node, visitAnnotationsDeclarations, context); - } - } - function visitAnnotations(node) { - switch (node.kind) { + case 279 /* SyntaxKind.ImportSpecifier */: + return visitImportSpecifier(node); case 169 /* SyntaxKind.Decorator */: return visitAnnotation(node); default: return ts.visitEachChild(node, visitAnnotations, context); } } + function visitImportSpecifier(node) { + // Return if the import has type or not refered to Annotation + if (node.isTypeOnly || !resolver.isReferredToAnnotation(node)) { + return node; + } + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); + // Add magic prefix for import Annotation. For example, + // import {Anno} from "xxx" ---> import {__$$ETS_ANNOTATION$$__Anno} from "xxx" + return ts.factory.updateImportSpecifier(node, node.isTypeOnly, node.propertyName, magicPrefixName); + } function visitAnnotationDeclaration(node) { + // Add magic prefix for AnnotationDeclaration. For example, + // @interface Anno {} ---> @interface __$$ETS_ANNOTATION$$__Anno {} + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); // Add explicit type annotation and initializer. For example, // @interface Anno { // a = 10 + 5 @@ -47309,7 +47328,7 @@ var ts; // // will be transformed to // - // @interface Anno { + // @interface __$$ETS_ANNOTATION$$__Anno { // a: number = 15 // } var members = node.members.map(function (node) { @@ -47317,7 +47336,7 @@ var ts; var initializer = resolver.getAnnotationPropertyEvaluatedInitializer(node); return ts.factory.updateAnnotationPropertyDeclaration(node, node.name, type, initializer); }); - return ts.factory.updateAnnotationDeclaration(node, node.modifiers, node.name, members); + return ts.factory.updateAnnotationDeclaration(node, node.modifiers, magicPrefixName, members); } function visitAnnotation(node) { if (!node.annotationDeclaration) { @@ -47335,7 +47354,7 @@ var ts; // and // // Add the magic prefix for annotation name. For example, - // @myModule.Anno({a: 10, b: "abc"}) --- > @#myModule.Anno({a: 10, b: "abc"}) + // @myModule.Anno({a: 10, b: "abc"}) --- > @myModule.__$$ETS_ANNOTATION$$__Anno({a: 10, b: "abc"}) return ts.factory.updateDecorator(node, addMagicPrefixToAnnotationNameIdentifier(addDefaultValuesIntoAnnotationObjectLiteral(node))); } function addMagicPrefixToAnnotationNameIdentifier(expr) { @@ -47344,7 +47363,7 @@ var ts; return ts.factory.createIdentifier(ts.annotationMagicNamePrefix + expr.escapedText); case 211 /* SyntaxKind.PropertyAccessExpression */: var propAccessExpr = expr; - return ts.factory.updatePropertyAccessExpression(propAccessExpr, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.expression), propAccessExpr.name); + return ts.factory.updatePropertyAccessExpression(propAccessExpr, propAccessExpr.expression, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.name)); case 213 /* SyntaxKind.CallExpression */: var callExpr = expr; return ts.factory.updateCallExpression(callExpr, addMagicPrefixToAnnotationNameIdentifier(callExpr.expression), callExpr.typeArguments, callExpr.arguments); @@ -59388,6 +59407,7 @@ var ts; case 263 /* SyntaxKind.FunctionDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: case 274 /* SyntaxKind.ImportEqualsDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: // external module augmentation is always visible if (ts.isExternalModuleAugmentation(node)) { return true; @@ -97907,7 +97927,7 @@ var ts; } } function modifierVisitor(node) { - if (ts.isDecorator(node)) + if (ts.isDecoratorOrAnnotation(node)) return undefined; if (ts.modifierToFlag(node.kind) & 117086 /* ModifierFlags.TypeScriptModifier */) { return undefined; @@ -115093,6 +115113,7 @@ var ts; case 265 /* SyntaxKind.StructDeclaration */: case 268 /* SyntaxKind.TypeAliasDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: return !resolver.isDeclarationVisible(node); // The following should be doing their own visibility checks based on filtering their members case 261 /* SyntaxKind.VariableDeclaration */: @@ -115387,7 +115408,12 @@ var ts; if (ts.isPrivateIdentifier(input.name)) { return cleanup(/*returnValue*/ undefined); } - var reservedDecorators_1 = ts.getReservedDecoratorsOfStructDeclaration(input, host); + var reservedDecorators_1 = ts.concatenate(ts.getReservedDecoratorsOfStructDeclaration(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators_1, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); var sig = factory.createMethodDeclaration(ts.concatenateDecoratorsAndModifiers(reservedDecorators_1, ensureModifiers(input)), /*asteriskToken*/ undefined, input.name, input.questionToken, ts.inEtsStylesContext(input, host) ? undefined : ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), /*body*/ undefined); @@ -115814,8 +115840,12 @@ var ts; } else { var heritageClauses = transformHeritageClauses(input.heritageClauses); - var reservedDecorators = ts.getReservedDecoratorsOfEtsFile(input, host); - ; + var reservedDecorators = ts.concatenate(ts.getReservedDecoratorsOfEtsFile(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); return cleanup(factory.updateClassDeclaration(input, ts.concatenateDecoratorsAndModifiers(reservedDecorators, modifiers), input.name, typeParameters, heritageClauses, members)); } } @@ -120424,7 +120454,7 @@ var ts; // if all modifier-likes are `Modifier`, simply emit the array as modifiers. return emitModifiers(node, modifiers); } - if (ts.every(modifiers, ts.isDecorator)) { + if (ts.every(modifiers, ts.isDecoratorOrAnnotation)) { // if all modifier-likes are `Decorator`, simply emit the array as decorators. return emitDecorators(node, modifiers); } @@ -120437,7 +120467,7 @@ var ts; while (start < modifiers.length) { while (pos < modifiers.length) { var modifier = modifiers[pos]; - mode = ts.isDecorator(modifier) ? "decorators" : "modifiers"; + mode = ts.isDecoratorOrAnnotation(modifier) ? "decorators" : "modifiers"; if (lastMode === undefined) { lastMode = mode; } diff --git a/lib/typescript.d.ts b/lib/typescript.d.ts index fd13dea264ad5201e316114cf9ac8257b5d54e63..64cabdd208cde96120173441ab4526a8685aa91b 100644 --- a/lib/typescript.d.ts +++ b/lib/typescript.d.ts @@ -4789,6 +4789,7 @@ declare namespace ts { function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; + function getAnnotations(node: HasDecorators): readonly Decorator[] | undefined; function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; function getAllDecorators(node: Node | undefined): readonly Decorator[]; function getIllegalDecorators(node: HasIllegalDecorators): readonly Decorator[] | undefined; @@ -5082,6 +5083,7 @@ declare namespace ts { function isComputedPropertyName(node: Node): node is ComputedPropertyName; function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; + function isDecoratorOrAnnotation(node: Node): node is Decorator; function isDecorator(node: Node): node is Decorator; function isAnnotation(node: Node): node is Annotation; function isPropertySignature(node: Node): node is PropertySignature; diff --git a/lib/typescript.js b/lib/typescript.js index b3b12717bf1e73f4c8f72e68f250f7804f7591d8..8263f4b252a5f81b8bf9f4cb0c296a7d01576621 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -13183,6 +13183,12 @@ var ts; } } ts.getDecorators = getDecorators; + function getAnnotations(node) { + if (ts.hasAnnotations(node)) { + return ts.filter(node.modifiers, ts.isAnnotation); + } + } + ts.getAnnotations = getAnnotations; function getModifiers(node) { if (ts.hasSyntacticModifier(node, 126975 /* ModifierFlags.Modifier */)) { return ts.filter(node.modifiers, isModifier); @@ -13936,7 +13942,7 @@ var ts; ts.isNamedClassElement = isNamedClassElement; // Type members function isModifierLike(node) { - return isModifier(node) || ts.isDecorator(node); + return isModifier(node) || ts.isDecoratorOrAnnotation(node); } ts.isModifierLike = isModifierLike; function isTypeElement(node) { @@ -29744,6 +29750,10 @@ var ts; return node.kind === 168 /* SyntaxKind.Parameter */; } ts.isParameter = isParameter; + function isDecoratorOrAnnotation(node) { + return node.kind === 169 /* SyntaxKind.Decorator */; + } + ts.isDecoratorOrAnnotation = isDecoratorOrAnnotation; function isDecorator(node) { return node.kind === 169 /* SyntaxKind.Decorator */ && node.annotationDeclaration === undefined; } @@ -47271,28 +47281,37 @@ var ts; if (node.isDeclarationFile) { return node; } - // Firstly, visit declarations - var updatedSource = ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotationsDeclarations, context)); - // Secondly, visit usage of annotations - return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(updatedSource.statements, visitAnnotations, context)); + // visit declarations, import and usage of annotations + return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotations, context)); } - function visitAnnotationsDeclarations(node) { + function visitAnnotations(node) { switch (node.kind) { case 266 /* SyntaxKind.AnnotationDeclaration */: return visitAnnotationDeclaration(node); - default: - return ts.visitEachChild(node, visitAnnotationsDeclarations, context); - } - } - function visitAnnotations(node) { - switch (node.kind) { + case 279 /* SyntaxKind.ImportSpecifier */: + return visitImportSpecifier(node); case 169 /* SyntaxKind.Decorator */: return visitAnnotation(node); default: return ts.visitEachChild(node, visitAnnotations, context); } } + function visitImportSpecifier(node) { + // Return if the import has type or not refered to Annotation + if (node.isTypeOnly || !resolver.isReferredToAnnotation(node)) { + return node; + } + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); + // Add magic prefix for import Annotation. For example, + // import {Anno} from "xxx" ---> import {__$$ETS_ANNOTATION$$__Anno} from "xxx" + return ts.factory.updateImportSpecifier(node, node.isTypeOnly, node.propertyName, magicPrefixName); + } function visitAnnotationDeclaration(node) { + // Add magic prefix for AnnotationDeclaration. For example, + // @interface Anno {} ---> @interface __$$ETS_ANNOTATION$$__Anno {} + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); // Add explicit type annotation and initializer. For example, // @interface Anno { // a = 10 + 5 @@ -47300,7 +47319,7 @@ var ts; // // will be transformed to // - // @interface Anno { + // @interface __$$ETS_ANNOTATION$$__Anno { // a: number = 15 // } var members = node.members.map(function (node) { @@ -47308,7 +47327,7 @@ var ts; var initializer = resolver.getAnnotationPropertyEvaluatedInitializer(node); return ts.factory.updateAnnotationPropertyDeclaration(node, node.name, type, initializer); }); - return ts.factory.updateAnnotationDeclaration(node, node.modifiers, node.name, members); + return ts.factory.updateAnnotationDeclaration(node, node.modifiers, magicPrefixName, members); } function visitAnnotation(node) { if (!node.annotationDeclaration) { @@ -47326,7 +47345,7 @@ var ts; // and // // Add the magic prefix for annotation name. For example, - // @myModule.Anno({a: 10, b: "abc"}) --- > @#myModule.Anno({a: 10, b: "abc"}) + // @myModule.Anno({a: 10, b: "abc"}) --- > @myModule.__$$ETS_ANNOTATION$$__Anno({a: 10, b: "abc"}) return ts.factory.updateDecorator(node, addMagicPrefixToAnnotationNameIdentifier(addDefaultValuesIntoAnnotationObjectLiteral(node))); } function addMagicPrefixToAnnotationNameIdentifier(expr) { @@ -47335,7 +47354,7 @@ var ts; return ts.factory.createIdentifier(ts.annotationMagicNamePrefix + expr.escapedText); case 211 /* SyntaxKind.PropertyAccessExpression */: var propAccessExpr = expr; - return ts.factory.updatePropertyAccessExpression(propAccessExpr, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.expression), propAccessExpr.name); + return ts.factory.updatePropertyAccessExpression(propAccessExpr, propAccessExpr.expression, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.name)); case 213 /* SyntaxKind.CallExpression */: var callExpr = expr; return ts.factory.updateCallExpression(callExpr, addMagicPrefixToAnnotationNameIdentifier(callExpr.expression), callExpr.typeArguments, callExpr.arguments); @@ -59379,6 +59398,7 @@ var ts; case 263 /* SyntaxKind.FunctionDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: case 274 /* SyntaxKind.ImportEqualsDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: // external module augmentation is always visible if (ts.isExternalModuleAugmentation(node)) { return true; @@ -97898,7 +97918,7 @@ var ts; } } function modifierVisitor(node) { - if (ts.isDecorator(node)) + if (ts.isDecoratorOrAnnotation(node)) return undefined; if (ts.modifierToFlag(node.kind) & 117086 /* ModifierFlags.TypeScriptModifier */) { return undefined; @@ -115084,6 +115104,7 @@ var ts; case 265 /* SyntaxKind.StructDeclaration */: case 268 /* SyntaxKind.TypeAliasDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: return !resolver.isDeclarationVisible(node); // The following should be doing their own visibility checks based on filtering their members case 261 /* SyntaxKind.VariableDeclaration */: @@ -115378,7 +115399,12 @@ var ts; if (ts.isPrivateIdentifier(input.name)) { return cleanup(/*returnValue*/ undefined); } - var reservedDecorators_1 = ts.getReservedDecoratorsOfStructDeclaration(input, host); + var reservedDecorators_1 = ts.concatenate(ts.getReservedDecoratorsOfStructDeclaration(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators_1, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); var sig = factory.createMethodDeclaration(ts.concatenateDecoratorsAndModifiers(reservedDecorators_1, ensureModifiers(input)), /*asteriskToken*/ undefined, input.name, input.questionToken, ts.inEtsStylesContext(input, host) ? undefined : ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), /*body*/ undefined); @@ -115805,8 +115831,12 @@ var ts; } else { var heritageClauses = transformHeritageClauses(input.heritageClauses); - var reservedDecorators = ts.getReservedDecoratorsOfEtsFile(input, host); - ; + var reservedDecorators = ts.concatenate(ts.getReservedDecoratorsOfEtsFile(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); return cleanup(factory.updateClassDeclaration(input, ts.concatenateDecoratorsAndModifiers(reservedDecorators, modifiers), input.name, typeParameters, heritageClauses, members)); } } @@ -120415,7 +120445,7 @@ var ts; // if all modifier-likes are `Modifier`, simply emit the array as modifiers. return emitModifiers(node, modifiers); } - if (ts.every(modifiers, ts.isDecorator)) { + if (ts.every(modifiers, ts.isDecoratorOrAnnotation)) { // if all modifier-likes are `Decorator`, simply emit the array as decorators. return emitDecorators(node, modifiers); } @@ -120428,7 +120458,7 @@ var ts; while (start < modifiers.length) { while (pos < modifiers.length) { var modifier = modifiers[pos]; - mode = ts.isDecorator(modifier) ? "decorators" : "modifiers"; + mode = ts.isDecoratorOrAnnotation(modifier) ? "decorators" : "modifiers"; if (lastMode === undefined) { lastMode = mode; } diff --git a/lib/typescriptServices.d.ts b/lib/typescriptServices.d.ts index b03a7329cf0277b6cb911e956066e4a488f25e99..712fa1a1927f89d3522633bd455e6108fc90edf4 100644 --- a/lib/typescriptServices.d.ts +++ b/lib/typescriptServices.d.ts @@ -4789,6 +4789,7 @@ declare namespace ts { function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; + function getAnnotations(node: HasDecorators): readonly Decorator[] | undefined; function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; function getAllDecorators(node: Node | undefined): readonly Decorator[]; function getIllegalDecorators(node: HasIllegalDecorators): readonly Decorator[] | undefined; @@ -5082,6 +5083,7 @@ declare namespace ts { function isComputedPropertyName(node: Node): node is ComputedPropertyName; function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; + function isDecoratorOrAnnotation(node: Node): node is Decorator; function isDecorator(node: Node): node is Decorator; function isAnnotation(node: Node): node is Annotation; function isPropertySignature(node: Node): node is PropertySignature; diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 2c6f5d45c5c63463034907982265d1dbbe88da86..e68d3a9fc90c179fbb090e79a34a97ef88b88d2d 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -13183,6 +13183,12 @@ var ts; } } ts.getDecorators = getDecorators; + function getAnnotations(node) { + if (ts.hasAnnotations(node)) { + return ts.filter(node.modifiers, ts.isAnnotation); + } + } + ts.getAnnotations = getAnnotations; function getModifiers(node) { if (ts.hasSyntacticModifier(node, 126975 /* ModifierFlags.Modifier */)) { return ts.filter(node.modifiers, isModifier); @@ -13936,7 +13942,7 @@ var ts; ts.isNamedClassElement = isNamedClassElement; // Type members function isModifierLike(node) { - return isModifier(node) || ts.isDecorator(node); + return isModifier(node) || ts.isDecoratorOrAnnotation(node); } ts.isModifierLike = isModifierLike; function isTypeElement(node) { @@ -29744,6 +29750,10 @@ var ts; return node.kind === 168 /* SyntaxKind.Parameter */; } ts.isParameter = isParameter; + function isDecoratorOrAnnotation(node) { + return node.kind === 169 /* SyntaxKind.Decorator */; + } + ts.isDecoratorOrAnnotation = isDecoratorOrAnnotation; function isDecorator(node) { return node.kind === 169 /* SyntaxKind.Decorator */ && node.annotationDeclaration === undefined; } @@ -47271,28 +47281,37 @@ var ts; if (node.isDeclarationFile) { return node; } - // Firstly, visit declarations - var updatedSource = ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotationsDeclarations, context)); - // Secondly, visit usage of annotations - return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(updatedSource.statements, visitAnnotations, context)); + // visit declarations, import and usage of annotations + return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotations, context)); } - function visitAnnotationsDeclarations(node) { + function visitAnnotations(node) { switch (node.kind) { case 266 /* SyntaxKind.AnnotationDeclaration */: return visitAnnotationDeclaration(node); - default: - return ts.visitEachChild(node, visitAnnotationsDeclarations, context); - } - } - function visitAnnotations(node) { - switch (node.kind) { + case 279 /* SyntaxKind.ImportSpecifier */: + return visitImportSpecifier(node); case 169 /* SyntaxKind.Decorator */: return visitAnnotation(node); default: return ts.visitEachChild(node, visitAnnotations, context); } } + function visitImportSpecifier(node) { + // Return if the import has type or not refered to Annotation + if (node.isTypeOnly || !resolver.isReferredToAnnotation(node)) { + return node; + } + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); + // Add magic prefix for import Annotation. For example, + // import {Anno} from "xxx" ---> import {__$$ETS_ANNOTATION$$__Anno} from "xxx" + return ts.factory.updateImportSpecifier(node, node.isTypeOnly, node.propertyName, magicPrefixName); + } function visitAnnotationDeclaration(node) { + // Add magic prefix for AnnotationDeclaration. For example, + // @interface Anno {} ---> @interface __$$ETS_ANNOTATION$$__Anno {} + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); // Add explicit type annotation and initializer. For example, // @interface Anno { // a = 10 + 5 @@ -47300,7 +47319,7 @@ var ts; // // will be transformed to // - // @interface Anno { + // @interface __$$ETS_ANNOTATION$$__Anno { // a: number = 15 // } var members = node.members.map(function (node) { @@ -47308,7 +47327,7 @@ var ts; var initializer = resolver.getAnnotationPropertyEvaluatedInitializer(node); return ts.factory.updateAnnotationPropertyDeclaration(node, node.name, type, initializer); }); - return ts.factory.updateAnnotationDeclaration(node, node.modifiers, node.name, members); + return ts.factory.updateAnnotationDeclaration(node, node.modifiers, magicPrefixName, members); } function visitAnnotation(node) { if (!node.annotationDeclaration) { @@ -47326,7 +47345,7 @@ var ts; // and // // Add the magic prefix for annotation name. For example, - // @myModule.Anno({a: 10, b: "abc"}) --- > @#myModule.Anno({a: 10, b: "abc"}) + // @myModule.Anno({a: 10, b: "abc"}) --- > @myModule.__$$ETS_ANNOTATION$$__Anno({a: 10, b: "abc"}) return ts.factory.updateDecorator(node, addMagicPrefixToAnnotationNameIdentifier(addDefaultValuesIntoAnnotationObjectLiteral(node))); } function addMagicPrefixToAnnotationNameIdentifier(expr) { @@ -47335,7 +47354,7 @@ var ts; return ts.factory.createIdentifier(ts.annotationMagicNamePrefix + expr.escapedText); case 211 /* SyntaxKind.PropertyAccessExpression */: var propAccessExpr = expr; - return ts.factory.updatePropertyAccessExpression(propAccessExpr, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.expression), propAccessExpr.name); + return ts.factory.updatePropertyAccessExpression(propAccessExpr, propAccessExpr.expression, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.name)); case 213 /* SyntaxKind.CallExpression */: var callExpr = expr; return ts.factory.updateCallExpression(callExpr, addMagicPrefixToAnnotationNameIdentifier(callExpr.expression), callExpr.typeArguments, callExpr.arguments); @@ -59379,6 +59398,7 @@ var ts; case 263 /* SyntaxKind.FunctionDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: case 274 /* SyntaxKind.ImportEqualsDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: // external module augmentation is always visible if (ts.isExternalModuleAugmentation(node)) { return true; @@ -97898,7 +97918,7 @@ var ts; } } function modifierVisitor(node) { - if (ts.isDecorator(node)) + if (ts.isDecoratorOrAnnotation(node)) return undefined; if (ts.modifierToFlag(node.kind) & 117086 /* ModifierFlags.TypeScriptModifier */) { return undefined; @@ -115084,6 +115104,7 @@ var ts; case 265 /* SyntaxKind.StructDeclaration */: case 268 /* SyntaxKind.TypeAliasDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: return !resolver.isDeclarationVisible(node); // The following should be doing their own visibility checks based on filtering their members case 261 /* SyntaxKind.VariableDeclaration */: @@ -115378,7 +115399,12 @@ var ts; if (ts.isPrivateIdentifier(input.name)) { return cleanup(/*returnValue*/ undefined); } - var reservedDecorators_1 = ts.getReservedDecoratorsOfStructDeclaration(input, host); + var reservedDecorators_1 = ts.concatenate(ts.getReservedDecoratorsOfStructDeclaration(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators_1, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); var sig = factory.createMethodDeclaration(ts.concatenateDecoratorsAndModifiers(reservedDecorators_1, ensureModifiers(input)), /*asteriskToken*/ undefined, input.name, input.questionToken, ts.inEtsStylesContext(input, host) ? undefined : ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), /*body*/ undefined); @@ -115805,8 +115831,12 @@ var ts; } else { var heritageClauses = transformHeritageClauses(input.heritageClauses); - var reservedDecorators = ts.getReservedDecoratorsOfEtsFile(input, host); - ; + var reservedDecorators = ts.concatenate(ts.getReservedDecoratorsOfEtsFile(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); return cleanup(factory.updateClassDeclaration(input, ts.concatenateDecoratorsAndModifiers(reservedDecorators, modifiers), input.name, typeParameters, heritageClauses, members)); } } @@ -120415,7 +120445,7 @@ var ts; // if all modifier-likes are `Modifier`, simply emit the array as modifiers. return emitModifiers(node, modifiers); } - if (ts.every(modifiers, ts.isDecorator)) { + if (ts.every(modifiers, ts.isDecoratorOrAnnotation)) { // if all modifier-likes are `Decorator`, simply emit the array as decorators. return emitDecorators(node, modifiers); } @@ -120428,7 +120458,7 @@ var ts; while (start < modifiers.length) { while (pos < modifiers.length) { var modifier = modifiers[pos]; - mode = ts.isDecorator(modifier) ? "decorators" : "modifiers"; + mode = ts.isDecoratorOrAnnotation(modifier) ? "decorators" : "modifiers"; if (lastMode === undefined) { lastMode = mode; } diff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js index 8ddf991d82482c29bc14b0ee134954dda788e953..0edc064b140427c27ec61262c7701e1ed594ae62 100644 --- a/lib/typingsInstaller.js +++ b/lib/typingsInstaller.js @@ -13173,6 +13173,12 @@ var ts; } } ts.getDecorators = getDecorators; + function getAnnotations(node) { + if (ts.hasAnnotations(node)) { + return ts.filter(node.modifiers, ts.isAnnotation); + } + } + ts.getAnnotations = getAnnotations; function getModifiers(node) { if (ts.hasSyntacticModifier(node, 126975 /* ModifierFlags.Modifier */)) { return ts.filter(node.modifiers, isModifier); @@ -13926,7 +13932,7 @@ var ts; ts.isNamedClassElement = isNamedClassElement; // Type members function isModifierLike(node) { - return isModifier(node) || ts.isDecorator(node); + return isModifier(node) || ts.isDecoratorOrAnnotation(node); } ts.isModifierLike = isModifierLike; function isTypeElement(node) { @@ -29734,6 +29740,10 @@ var ts; return node.kind === 168 /* SyntaxKind.Parameter */; } ts.isParameter = isParameter; + function isDecoratorOrAnnotation(node) { + return node.kind === 169 /* SyntaxKind.Decorator */; + } + ts.isDecoratorOrAnnotation = isDecoratorOrAnnotation; function isDecorator(node) { return node.kind === 169 /* SyntaxKind.Decorator */ && node.annotationDeclaration === undefined; } @@ -47261,28 +47271,37 @@ var ts; if (node.isDeclarationFile) { return node; } - // Firstly, visit declarations - var updatedSource = ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotationsDeclarations, context)); - // Secondly, visit usage of annotations - return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(updatedSource.statements, visitAnnotations, context)); + // visit declarations, import and usage of annotations + return ts.factory.updateSourceFile(node, ts.visitLexicalEnvironment(node.statements, visitAnnotations, context)); } - function visitAnnotationsDeclarations(node) { + function visitAnnotations(node) { switch (node.kind) { case 266 /* SyntaxKind.AnnotationDeclaration */: return visitAnnotationDeclaration(node); - default: - return ts.visitEachChild(node, visitAnnotationsDeclarations, context); - } - } - function visitAnnotations(node) { - switch (node.kind) { + case 279 /* SyntaxKind.ImportSpecifier */: + return visitImportSpecifier(node); case 169 /* SyntaxKind.Decorator */: return visitAnnotation(node); default: return ts.visitEachChild(node, visitAnnotations, context); } } + function visitImportSpecifier(node) { + // Return if the import has type or not refered to Annotation + if (node.isTypeOnly || !resolver.isReferredToAnnotation(node)) { + return node; + } + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); + // Add magic prefix for import Annotation. For example, + // import {Anno} from "xxx" ---> import {__$$ETS_ANNOTATION$$__Anno} from "xxx" + return ts.factory.updateImportSpecifier(node, node.isTypeOnly, node.propertyName, magicPrefixName); + } function visitAnnotationDeclaration(node) { + // Add magic prefix for AnnotationDeclaration. For example, + // @interface Anno {} ---> @interface __$$ETS_ANNOTATION$$__Anno {} + var magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + ts.Debug.assert(ts.isIdentifier(magicPrefixName)); // Add explicit type annotation and initializer. For example, // @interface Anno { // a = 10 + 5 @@ -47290,7 +47309,7 @@ var ts; // // will be transformed to // - // @interface Anno { + // @interface __$$ETS_ANNOTATION$$__Anno { // a: number = 15 // } var members = node.members.map(function (node) { @@ -47298,7 +47317,7 @@ var ts; var initializer = resolver.getAnnotationPropertyEvaluatedInitializer(node); return ts.factory.updateAnnotationPropertyDeclaration(node, node.name, type, initializer); }); - return ts.factory.updateAnnotationDeclaration(node, node.modifiers, node.name, members); + return ts.factory.updateAnnotationDeclaration(node, node.modifiers, magicPrefixName, members); } function visitAnnotation(node) { if (!node.annotationDeclaration) { @@ -47316,7 +47335,7 @@ var ts; // and // // Add the magic prefix for annotation name. For example, - // @myModule.Anno({a: 10, b: "abc"}) --- > @#myModule.Anno({a: 10, b: "abc"}) + // @myModule.Anno({a: 10, b: "abc"}) --- > @myModule.__$$ETS_ANNOTATION$$__Anno({a: 10, b: "abc"}) return ts.factory.updateDecorator(node, addMagicPrefixToAnnotationNameIdentifier(addDefaultValuesIntoAnnotationObjectLiteral(node))); } function addMagicPrefixToAnnotationNameIdentifier(expr) { @@ -47325,7 +47344,7 @@ var ts; return ts.factory.createIdentifier(ts.annotationMagicNamePrefix + expr.escapedText); case 211 /* SyntaxKind.PropertyAccessExpression */: var propAccessExpr = expr; - return ts.factory.updatePropertyAccessExpression(propAccessExpr, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.expression), propAccessExpr.name); + return ts.factory.updatePropertyAccessExpression(propAccessExpr, propAccessExpr.expression, addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.name)); case 213 /* SyntaxKind.CallExpression */: var callExpr = expr; return ts.factory.updateCallExpression(callExpr, addMagicPrefixToAnnotationNameIdentifier(callExpr.expression), callExpr.typeArguments, callExpr.arguments); @@ -59369,6 +59388,7 @@ var ts; case 263 /* SyntaxKind.FunctionDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: case 274 /* SyntaxKind.ImportEqualsDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: // external module augmentation is always visible if (ts.isExternalModuleAugmentation(node)) { return true; @@ -97888,7 +97908,7 @@ var ts; } } function modifierVisitor(node) { - if (ts.isDecorator(node)) + if (ts.isDecoratorOrAnnotation(node)) return undefined; if (ts.modifierToFlag(node.kind) & 117086 /* ModifierFlags.TypeScriptModifier */) { return undefined; @@ -115074,6 +115094,7 @@ var ts; case 265 /* SyntaxKind.StructDeclaration */: case 268 /* SyntaxKind.TypeAliasDeclaration */: case 269 /* SyntaxKind.EnumDeclaration */: + case 266 /* SyntaxKind.AnnotationDeclaration */: return !resolver.isDeclarationVisible(node); // The following should be doing their own visibility checks based on filtering their members case 261 /* SyntaxKind.VariableDeclaration */: @@ -115368,7 +115389,12 @@ var ts; if (ts.isPrivateIdentifier(input.name)) { return cleanup(/*returnValue*/ undefined); } - var reservedDecorators_1 = ts.getReservedDecoratorsOfStructDeclaration(input, host); + var reservedDecorators_1 = ts.concatenate(ts.getReservedDecoratorsOfStructDeclaration(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators_1, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); var sig = factory.createMethodDeclaration(ts.concatenateDecoratorsAndModifiers(reservedDecorators_1, ensureModifiers(input)), /*asteriskToken*/ undefined, input.name, input.questionToken, ts.inEtsStylesContext(input, host) ? undefined : ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), /*body*/ undefined); @@ -115795,8 +115821,12 @@ var ts; } else { var heritageClauses = transformHeritageClauses(input.heritageClauses); - var reservedDecorators = ts.getReservedDecoratorsOfEtsFile(input, host); - ; + var reservedDecorators = ts.concatenate(ts.getReservedDecoratorsOfEtsFile(input, host), ts.getAnnotations(input)); + ts.forEach(reservedDecorators, function (decorator) { + if (ts.isAnnotation(decorator) && ts.isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression), enclosingDeclaration); + } + }); return cleanup(factory.updateClassDeclaration(input, ts.concatenateDecoratorsAndModifiers(reservedDecorators, modifiers), input.name, typeParameters, heritageClauses, members)); } } @@ -120405,7 +120435,7 @@ var ts; // if all modifier-likes are `Modifier`, simply emit the array as modifiers. return emitModifiers(node, modifiers); } - if (ts.every(modifiers, ts.isDecorator)) { + if (ts.every(modifiers, ts.isDecoratorOrAnnotation)) { // if all modifier-likes are `Decorator`, simply emit the array as decorators. return emitDecorators(node, modifiers); } @@ -120418,7 +120448,7 @@ var ts; while (start < modifiers.length) { while (pos < modifiers.length) { var modifier = modifiers[pos]; - mode = ts.isDecorator(modifier) ? "decorators" : "modifiers"; + mode = ts.isDecoratorOrAnnotation(modifier) ? "decorators" : "modifiers"; if (lastMode === undefined) { lastMode = mode; } diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0508afc088a43e7eee9ccc2669583ec8e17059b5..e59010e47d8f61ccab11cd309bd73f13ce5d1b7c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8772,6 +8772,7 @@ namespace ts { case SyntaxKind.FunctionDeclaration: case SyntaxKind.EnumDeclaration: case SyntaxKind.ImportEqualsDeclaration: + case SyntaxKind.AnnotationDeclaration: // external module augmentation is always visible if (isExternalModuleAugmentation(node)) { return true; diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 0b0e89debdd293e8c7313b37ff258ea75f1839e3..c83ee0c64f04e20ef59d8852480dac9e7fe077d0 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4311,7 +4311,7 @@ namespace ts { return emitModifiers(node, modifiers as NodeArray); } - if (every(modifiers, isDecorator)) { + if (every(modifiers, isDecoratorOrAnnotation)) { // if all modifier-likes are `Decorator`, simply emit the array as decorators. return emitDecorators(node, modifiers as NodeArray); } @@ -4326,7 +4326,7 @@ namespace ts { while (start < modifiers.length) { while (pos < modifiers.length) { const modifier = modifiers[pos]; - mode = isDecorator(modifier) ? "decorators" : "modifiers"; + mode = isDecoratorOrAnnotation(modifier) ? "decorators" : "modifiers"; if (lastMode === undefined) { lastMode = mode; } diff --git a/src/compiler/factory/nodeTests.ts b/src/compiler/factory/nodeTests.ts index d1cdf297d4c75830465f0776e99e08a122f3346e..5747108f2f39d4ffc0e92b1f1b5c027cb9327a04 100644 --- a/src/compiler/factory/nodeTests.ts +++ b/src/compiler/factory/nodeTests.ts @@ -175,6 +175,10 @@ namespace ts { return node.kind === SyntaxKind.Parameter; } + export function isDecoratorOrAnnotation(node: Node): node is Decorator { + return node.kind === SyntaxKind.Decorator; + } + export function isDecorator(node: Node): node is Decorator { return node.kind === SyntaxKind.Decorator && (node as Decorator).annotationDeclaration === undefined; } diff --git a/src/compiler/ohApi.ts b/src/compiler/ohApi.ts index 82c6809c376a75d49911121005ac58203a44c497..8572c6911de76fbe11eef7b61b78df323cee317c 100644 --- a/src/compiler/ohApi.ts +++ b/src/compiler/ohApi.ts @@ -412,26 +412,18 @@ namespace ts { if (node.isDeclarationFile) { return node; } - // Firstly, visit declarations - const updatedSource = factory.updateSourceFile(node, - visitLexicalEnvironment(node.statements, visitAnnotationsDeclarations, context)); - // Secondly, visit usage of annotations + // visit declarations, import and usage of annotations return factory.updateSourceFile( node, - visitLexicalEnvironment(updatedSource.statements, visitAnnotations, context)); + visitLexicalEnvironment(node.statements, visitAnnotations, context)); } - function visitAnnotationsDeclarations(node: Node): VisitResult { + function visitAnnotations(node: Node): VisitResult { switch (node.kind) { case SyntaxKind.AnnotationDeclaration: return visitAnnotationDeclaration(node); - default: - return visitEachChild(node, visitAnnotationsDeclarations, context); - } - } - - function visitAnnotations(node: Node): VisitResult { - switch (node.kind) { + case SyntaxKind.ImportSpecifier: + return visitImportSpecifier(node); case SyntaxKind.Decorator: return visitAnnotation(node); default: @@ -439,7 +431,23 @@ namespace ts { } } + function visitImportSpecifier(node: ImportSpecifier): VisitResult { + // Return if the import has type or not refered to Annotation + if (node.isTypeOnly || !resolver.isReferredToAnnotation(node)) { + return node; + } + const magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + Debug.assert(isIdentifier(magicPrefixName)); + // Add magic prefix for import Annotation. For example, + // import {Anno} from "xxx" ---> import {__$$ETS_ANNOTATION$$__Anno} from "xxx" + return factory.updateImportSpecifier(node, node.isTypeOnly, node.propertyName, magicPrefixName); + } + function visitAnnotationDeclaration(node: AnnotationDeclaration): VisitResult { + // Add magic prefix for AnnotationDeclaration. For example, + // @interface Anno {} ---> @interface __$$ETS_ANNOTATION$$__Anno {} + const magicPrefixName = addMagicPrefixToAnnotationNameIdentifier(node.name); + Debug.assert(isIdentifier(magicPrefixName)); // Add explicit type annotation and initializer. For example, // @interface Anno { // a = 10 + 5 @@ -447,7 +455,7 @@ namespace ts { // // will be transformed to // - // @interface Anno { + // @interface __$$ETS_ANNOTATION$$__Anno { // a: number = 15 // } const members = node.members.map((node: AnnotationPropertyDeclaration) => { @@ -456,7 +464,7 @@ namespace ts { return factory.updateAnnotationPropertyDeclaration(node, node.name, type, initializer); }); - return factory.updateAnnotationDeclaration(node, node.modifiers, node.name, members); + return factory.updateAnnotationDeclaration(node, node.modifiers, magicPrefixName , members); } function visitAnnotation(node: Annotation): VisitResult { @@ -475,7 +483,7 @@ namespace ts { // and // // Add the magic prefix for annotation name. For example, - // @myModule.Anno({a: 10, b: "abc"}) --- > @#myModule.Anno({a: 10, b: "abc"}) + // @myModule.Anno({a: 10, b: "abc"}) --- > @myModule.__$$ETS_ANNOTATION$$__Anno({a: 10, b: "abc"}) return factory.updateDecorator( node, addMagicPrefixToAnnotationNameIdentifier( @@ -493,9 +501,8 @@ namespace ts { const propAccessExpr = expr as PropertyAccessExpression; return factory.updatePropertyAccessExpression( propAccessExpr, - addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.expression), - propAccessExpr.name - + propAccessExpr.expression, + addMagicPrefixToAnnotationNameIdentifier(propAccessExpr.name) as Identifier ); case SyntaxKind.CallExpression: const callExpr = expr as CallExpression; diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index c6534d90f5faa713a1e6917ee9946cafc0f80e60..eab8fba5a3178d77b87d162ec8cf0aa483493909 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -606,6 +606,7 @@ namespace ts { case SyntaxKind.StructDeclaration: case SyntaxKind.TypeAliasDeclaration: case SyntaxKind.EnumDeclaration: + case SyntaxKind.AnnotationDeclaration: return !resolver.isDeclarationVisible(node); // The following should be doing their own visibility checks based on filtering their members case SyntaxKind.VariableDeclaration: @@ -964,8 +965,12 @@ namespace ts { if (isPrivateIdentifier(input.name)) { return cleanup(/*returnValue*/ undefined); } - let reservedDecorators = getReservedDecoratorsOfStructDeclaration(input, host); - + let reservedDecorators = concatenate(getReservedDecoratorsOfStructDeclaration(input, host), getAnnotations(input)); + forEach(reservedDecorators, (decorator) => { + if (isAnnotation(decorator) && isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression) as Identifier, enclosingDeclaration) + } + }) const sig = factory.createMethodDeclaration( concatenateDecoratorsAndModifiers(reservedDecorators, ensureModifiers(input)), /*asteriskToken*/ undefined, @@ -1553,8 +1558,12 @@ namespace ts { } else { const heritageClauses = transformHeritageClauses(input.heritageClauses); - let reservedDecorators = getReservedDecoratorsOfEtsFile(input, host);; - + let reservedDecorators = concatenate(getReservedDecoratorsOfEtsFile(input, host), getAnnotations(input)); + forEach(reservedDecorators, (decorator) => { + if (isAnnotation(decorator) && isCallExpression(decorator.expression)) { + checkEntityNameVisibility((decorator.expression.expression) as Identifier, enclosingDeclaration) + } + }) return cleanup(factory.updateClassDeclaration( input, concatenateDecoratorsAndModifiers(reservedDecorators, modifiers), diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 5f70a357c8cd9c722c648d8cfd042c14b0aedb6e..00e461e3e8600cc365fc4d04867e9986c677e760 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -363,7 +363,7 @@ namespace ts { } function modifierVisitor(node: Node): VisitResult { - if (isDecorator(node)) return undefined; + if (isDecoratorOrAnnotation(node)) return undefined; if (modifierToFlag(node.kind) & ModifierFlags.TypeScriptModifier) { return undefined; } diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index 7ac44217752ec632815b1cbf2b0f0e48ba142173..5ebf86e12786352809f328d445bc1e5bd93d5403 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -651,6 +651,12 @@ namespace ts { } } + export function getAnnotations(node: HasDecorators): readonly Decorator[] | undefined { + if (hasAnnotations(node)) { + return filter(node.modifiers, isAnnotation); + } + } + export function getModifiers(node: HasModifiers): readonly Modifier[] | undefined { if (hasSyntacticModifier(node, ModifierFlags.Modifier)) { return filter(node.modifiers, isModifier); @@ -1421,7 +1427,7 @@ namespace ts { // Type members export function isModifierLike(node: Node): node is ModifierLike { - return isModifier(node) || isDecorator(node); + return isModifier(node) || isDecoratorOrAnnotation(node); } export function isTypeElement(node: Node): node is TypeElement { diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f6d24576d82d96fbab9b562528a665fda51fc13c..f9cc3adccbc9f24d2f64ea3d6dcc5a1fe9a60832 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4789,6 +4789,7 @@ declare namespace ts { function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; + function getAnnotations(node: HasDecorators): readonly Decorator[] | undefined; function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; function getAllDecorators(node: Node | undefined): readonly Decorator[]; function getIllegalDecorators(node: HasIllegalDecorators): readonly Decorator[] | undefined; @@ -5082,6 +5083,7 @@ declare namespace ts { function isComputedPropertyName(node: Node): node is ComputedPropertyName; function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; + function isDecoratorOrAnnotation(node: Node): node is Decorator; function isDecorator(node: Node): node is Decorator; function isAnnotation(node: Node): node is Annotation; function isPropertySignature(node: Node): node is PropertySignature; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index fd13dea264ad5201e316114cf9ac8257b5d54e63..64cabdd208cde96120173441ab4526a8685aa91b 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4789,6 +4789,7 @@ declare namespace ts { function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; + function getAnnotations(node: HasDecorators): readonly Decorator[] | undefined; function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; function getAllDecorators(node: Node | undefined): readonly Decorator[]; function getIllegalDecorators(node: HasIllegalDecorators): readonly Decorator[] | undefined; @@ -5082,6 +5083,7 @@ declare namespace ts { function isComputedPropertyName(node: Node): node is ComputedPropertyName; function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; + function isDecoratorOrAnnotation(node: Node): node is Decorator; function isDecorator(node: Node): node is Decorator; function isAnnotation(node: Node): node is Annotation; function isPropertySignature(node: Node): node is PropertySignature;