mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-16 08:21:44 +00:00
Initial implementation if ugc, see #16; Fix tests
This commit is contained in:
66
src/ast.ts
66
src/ast.ts
@ -1050,12 +1050,60 @@ export abstract class DeclarationStatement extends Statement {
|
||||
/** Array of decorators. */
|
||||
decorators: Decorator[] | null = null;
|
||||
|
||||
protected _cachedInternalName: string | null = null;
|
||||
protected cachedProgramLevelInternalName: string | null = null;
|
||||
protected cachedFileLevelInternalName: string | null = null;
|
||||
|
||||
/** Gets the mangled internal name of this declaration. */
|
||||
get internalName(): string { return this._cachedInternalName === null ? this._cachedInternalName = mangleInternalName(this) : this._cachedInternalName; }
|
||||
/** Tests if this is a top-level declaration. */
|
||||
get isTopLevel(): bool { return this.parent != null && this.parent.kind == NodeKind.SOURCE; }
|
||||
/** Gets the mangled program-level internal name of this declaration. */
|
||||
get programLevelInternalName(): string {
|
||||
if (!this.cachedProgramLevelInternalName)
|
||||
this.cachedProgramLevelInternalName = mangleInternalName(this, true);
|
||||
return this.cachedProgramLevelInternalName;
|
||||
}
|
||||
|
||||
/** Gets the mangled file-level internal name of this declaration. */
|
||||
get fileLevelInternalName(): string {
|
||||
if (!this.cachedFileLevelInternalName)
|
||||
this.cachedFileLevelInternalName = mangleInternalName(this, false);
|
||||
return this.cachedFileLevelInternalName;
|
||||
}
|
||||
|
||||
/** Tests if this is a top-level declaration within its source file. */
|
||||
get isTopLevel(): bool {
|
||||
var parent = this.parent;
|
||||
if (!parent)
|
||||
return false;
|
||||
if (parent.kind == NodeKind.VARIABLE)
|
||||
if (!(parent = parent.parent))
|
||||
return false;
|
||||
return parent.kind == NodeKind.SOURCE;
|
||||
}
|
||||
|
||||
/** Tests if this declaration is a top-level export within its source file. */
|
||||
get isTopLevelExport(): bool {
|
||||
var parent = this.parent;
|
||||
if (!parent)
|
||||
return false;
|
||||
if (parent.kind == NodeKind.VARIABLE)
|
||||
if (!(parent = parent.parent))
|
||||
return false;
|
||||
if (parent.kind == NodeKind.NAMESPACEDECLARATION)
|
||||
return hasModifier(ModifierKind.EXPORT, this.modifiers) && (<NamespaceDeclaration>parent).isTopLevelExport;
|
||||
if (parent.kind == NodeKind.CLASSDECLARATION)
|
||||
return hasModifier(ModifierKind.STATIC, this.modifiers) && (<ClassDeclaration>parent).isTopLevelExport;
|
||||
return parent.kind == NodeKind.SOURCE && hasModifier(ModifierKind.EXPORT, this.modifiers);
|
||||
}
|
||||
|
||||
/** Tests if this declaration exported by the given member needs an explicit export. */
|
||||
needsExplicitExport(member: ExportMember): bool {
|
||||
// This is necessary because module-level exports are automatically created for
|
||||
// exported top level declarations of all sorts. In other words this function
|
||||
// tests that this condition doesn't apply so the export isn't a duplicate.
|
||||
return (
|
||||
member.identifier.name != member.externalIdentifier.name || // if aliased
|
||||
this.range.source != member.range.source || // if a re-export
|
||||
!this.isTopLevelExport // if not top-level
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/** Base class of all variable-like declaration statements with a type and initializer. */
|
||||
@ -1470,7 +1518,7 @@ export function mangleInternalPath(path: string): string {
|
||||
}
|
||||
|
||||
/** Mangles a declaration's name to an internal name. */
|
||||
export function mangleInternalName(declaration: DeclarationStatement): string {
|
||||
export function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {
|
||||
var name = declaration.name.name;
|
||||
var parent = declaration.parent;
|
||||
if (!parent)
|
||||
@ -1479,8 +1527,10 @@ export function mangleInternalName(declaration: DeclarationStatement): string {
|
||||
if (!(parent = parent.parent))
|
||||
return name;
|
||||
if (parent.kind == NodeKind.CLASSDECLARATION)
|
||||
return (<ClassDeclaration>parent).internalName + (hasModifier(ModifierKind.STATIC, declaration.modifiers) ? STATIC_DELIMITER : INSTANCE_DELIMITER) + name;
|
||||
return mangleInternalName(<ClassDeclaration>parent, asGlobal) + (hasModifier(ModifierKind.STATIC, declaration.modifiers) ? STATIC_DELIMITER : INSTANCE_DELIMITER) + name;
|
||||
if (parent.kind == NodeKind.NAMESPACEDECLARATION || parent.kind == NodeKind.ENUMDECLARATION)
|
||||
return (<DeclarationStatement>parent).internalName + STATIC_DELIMITER + name;
|
||||
return mangleInternalName(<DeclarationStatement>parent, asGlobal) + STATIC_DELIMITER + name;
|
||||
if (asGlobal)
|
||||
return name;
|
||||
return declaration.range.source.internalPath + PATH_DELIMITER + name;
|
||||
}
|
||||
|
100
src/compiler.ts
100
src/compiler.ts
@ -326,17 +326,11 @@ export class Compiler extends DiagnosticEmitter {
|
||||
// globals
|
||||
|
||||
compileGlobalDeclaration(declaration: VariableDeclaration, isConst: bool): Global | null {
|
||||
var element = this.program.elements.get(declaration.internalName);
|
||||
var element = this.program.elements.get(declaration.fileLevelInternalName);
|
||||
if (!element || element.kind != ElementKind.GLOBAL)
|
||||
throw new Error("global expected");
|
||||
if (!this.compileGlobal(<Global>element)) // reports
|
||||
return null;
|
||||
if (isModuleExport(element, declaration)) {
|
||||
if ((<Global>element).hasConstantValue)
|
||||
this.module.addGlobalExport(element.internalName, declaration.name.name);
|
||||
else
|
||||
this.warning(DiagnosticCode.Cannot_export_a_mutable_global, declaration.range);
|
||||
}
|
||||
return <Global>element;
|
||||
}
|
||||
|
||||
@ -416,7 +410,6 @@ export class Compiler extends DiagnosticEmitter {
|
||||
if (!this.module.noEmit)
|
||||
this.startFunctionBody.push(setExpr);
|
||||
} else {
|
||||
// TODO: not necessary to create a global if constant and not a file-level export anyway
|
||||
if (!global.isMutable) {
|
||||
if (!this.module.noEmit) {
|
||||
var exprType = _BinaryenExpressionGetType(initExpr);
|
||||
@ -441,11 +434,14 @@ export class Compiler extends DiagnosticEmitter {
|
||||
default:
|
||||
throw new Error("concrete type expected");
|
||||
}
|
||||
global.hasConstantValue = true;
|
||||
if (!declaration || isModuleExport(global, declaration))
|
||||
this.module.addGlobal(internalName, nativeType, global.isMutable, initExpr);
|
||||
}
|
||||
} else if (!this.module.noEmit)
|
||||
global.hasConstantValue = true;
|
||||
if (!declaration || declaration.isTopLevel) { // might be re-exported
|
||||
this.module.addGlobal(internalName, nativeType, global.isMutable, initExpr);
|
||||
}
|
||||
if (declaration && declaration.range.source.isEntry && declaration.isTopLevelExport)
|
||||
this.module.addGlobalExport(global.internalName, declaration.programLevelInternalName);
|
||||
} else
|
||||
this.module.addGlobal(internalName, nativeType, global.isMutable, initExpr);
|
||||
}
|
||||
global.isCompiled = true;
|
||||
@ -454,11 +450,11 @@ export class Compiler extends DiagnosticEmitter {
|
||||
|
||||
// enums
|
||||
|
||||
compileEnumDeclaration(declaration: EnumDeclaration): void {
|
||||
var element = this.program.elements.get(declaration.internalName);
|
||||
compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {
|
||||
var element = this.program.elements.get(declaration.fileLevelInternalName);
|
||||
if (!element || element.kind != ElementKind.ENUM)
|
||||
throw new Error("enum expected");
|
||||
this.compileEnum(<Enum>element);
|
||||
return this.compileEnum(<Enum>element) ? <Enum>element : null;
|
||||
}
|
||||
|
||||
compileEnum(element: Enum): bool {
|
||||
@ -473,10 +469,11 @@ export class Compiler extends DiagnosticEmitter {
|
||||
continue;
|
||||
var initInStart = false;
|
||||
var val = <EnumValue>member;
|
||||
var valueDeclaration = val.declaration;
|
||||
if (val.hasConstantValue) {
|
||||
this.module.addGlobal(val.internalName, NativeType.I32, false, this.module.createI32(val.constantValue));
|
||||
} else if (val.declaration) {
|
||||
var valueDeclaration = val.declaration;
|
||||
if (!element.declaration || element.declaration.isTopLevelExport)
|
||||
this.module.addGlobal(val.internalName, NativeType.I32, false, this.module.createI32(val.constantValue));
|
||||
} else if (valueDeclaration) {
|
||||
var initExpr: ExpressionRef;
|
||||
if (valueDeclaration.value) {
|
||||
initExpr = this.compileExpression(<Expression>valueDeclaration.value, Type.i32);
|
||||
@ -519,25 +516,26 @@ export class Compiler extends DiagnosticEmitter {
|
||||
}
|
||||
} else
|
||||
throw new Error("declaration expected");
|
||||
if (element.declaration && isModuleExport(element, element.declaration) && !initInStart)
|
||||
this.module.addGlobalExport(member.internalName, member.internalName);
|
||||
previousValue = <EnumValue>val;
|
||||
|
||||
// export values if the enum is exported
|
||||
if (element.declaration && element.declaration.range.source.isEntry && element.declaration.isTopLevelExport) {
|
||||
if (member.hasConstantValue)
|
||||
this.module.addGlobalExport(member.internalName, member.internalName);
|
||||
else if (valueDeclaration)
|
||||
this.warning(DiagnosticCode.Cannot_export_a_mutable_global, valueDeclaration.range);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// functions
|
||||
|
||||
compileFunctionDeclaration(declaration: FunctionDeclaration, typeArguments: TypeNode[], contextualTypeArguments: Map<string,Type> | null = null, alternativeReportNode: Node | null = null): void {
|
||||
var internalName = declaration.internalName;
|
||||
var element = this.program.elements.get(internalName);
|
||||
compileFunctionDeclaration(declaration: FunctionDeclaration, typeArguments: TypeNode[], contextualTypeArguments: Map<string,Type> | null = null, alternativeReportNode: Node | null = null): Function | null {
|
||||
var element = this.program.elements.get(declaration.fileLevelInternalName);
|
||||
if (!element || element.kind != ElementKind.FUNCTION_PROTOTYPE)
|
||||
throw new Error("function expected");
|
||||
var instance = this.compileFunctionUsingTypeArguments(<FunctionPrototype>element, typeArguments, contextualTypeArguments, alternativeReportNode); // reports
|
||||
if (!instance)
|
||||
return;
|
||||
if (isModuleExport(instance, declaration))
|
||||
this.module.addFunctionExport(instance.internalName, declaration.name.name);
|
||||
return this.compileFunctionUsingTypeArguments(<FunctionPrototype>element, typeArguments, contextualTypeArguments, alternativeReportNode); // reports
|
||||
}
|
||||
|
||||
compileFunctionUsingTypeArguments(prototype: FunctionPrototype, typeArguments: TypeNode[], contextualTypeArguments: Map<string,Type> | null = null, alternativeReportNode: Node | null = null): Function | null {
|
||||
@ -606,6 +604,9 @@ export class Compiler extends DiagnosticEmitter {
|
||||
this.module.addFunction(instance.internalName, typeRef, typesToNativeTypes(instance.additionalLocals), this.module.createBlock(null, <ExpressionRef[]>stmts, NativeType.None));
|
||||
}
|
||||
instance.finalize();
|
||||
if (declaration.range.source.isEntry && declaration.isTopLevelExport) {
|
||||
this.module.addFunctionExport(instance.internalName, declaration.name.name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -709,19 +710,25 @@ export class Compiler extends DiagnosticEmitter {
|
||||
break;
|
||||
|
||||
case ElementKind.FUNCTION_PROTOTYPE:
|
||||
if (!(<FunctionPrototype>element).isGeneric) {
|
||||
if (!(<FunctionPrototype>element).isGeneric && statement.range.source.isEntry) {
|
||||
var functionInstance = this.compileFunctionUsingTypeArguments(<FunctionPrototype>element, []);
|
||||
if (functionInstance && statement.range.source.isEntry)
|
||||
this.module.addFunctionExport(functionInstance.internalName, member.externalIdentifier.name);
|
||||
if (functionInstance) {
|
||||
var functionDeclaration = functionInstance.prototype.declaration;
|
||||
if (functionDeclaration && functionDeclaration.needsExplicitExport(member))
|
||||
this.module.addFunctionExport(functionInstance.internalName, member.externalIdentifier.name);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ElementKind.GLOBAL:
|
||||
if (this.compileGlobal(<Global>element) && statement.range.source.isEntry) {
|
||||
if ((<Global>element).hasConstantValue)
|
||||
this.module.addGlobalExport(element.internalName, member.externalIdentifier.name);
|
||||
else
|
||||
this.warning(DiagnosticCode.Cannot_export_a_mutable_global, member.range);
|
||||
var globalDeclaration = (<Global>element).declaration;
|
||||
if (globalDeclaration && globalDeclaration.needsExplicitExport(member)) {
|
||||
if ((<Global>element).hasConstantValue)
|
||||
this.module.addGlobalExport(element.internalName, member.externalIdentifier.name);
|
||||
else
|
||||
this.warning(DiagnosticCode.Cannot_export_a_mutable_global, member.range);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -735,8 +742,7 @@ export class Compiler extends DiagnosticEmitter {
|
||||
// classes
|
||||
|
||||
compileClassDeclaration(declaration: ClassDeclaration, typeArguments: TypeNode[], contextualTypeArguments: Map<string,Type> | null = null, alternativeReportNode: Node | null = null): void {
|
||||
var internalName = declaration.internalName;
|
||||
var element = this.program.elements.get(internalName);
|
||||
var element = this.program.elements.get(declaration.fileLevelInternalName);
|
||||
if (!element || element.kind != ElementKind.CLASS_PROTOTYPE)
|
||||
throw new Error("class expected");
|
||||
this.compileClassUsingTypeArguments(<ClassPrototype>element, typeArguments, contextualTypeArguments, alternativeReportNode);
|
||||
@ -3063,26 +3069,6 @@ export class Compiler extends DiagnosticEmitter {
|
||||
|
||||
// helpers
|
||||
|
||||
/** Tests whether an element is a module-level export from the entry file. */
|
||||
function isModuleExport(element: Element, declaration: DeclarationStatement): bool {
|
||||
if (!element.isExported)
|
||||
return false;
|
||||
var parentNode = declaration.parent;
|
||||
if (!parentNode)
|
||||
return false;
|
||||
if (declaration.range.source.isEntry && parentNode.kind != NodeKind.NAMESPACEDECLARATION)
|
||||
return true;
|
||||
if (parentNode.kind == NodeKind.VARIABLE)
|
||||
if (!(parentNode = parentNode.parent))
|
||||
return false;
|
||||
if (parentNode.kind != NodeKind.NAMESPACEDECLARATION && parentNode.kind != NodeKind.CLASSDECLARATION)
|
||||
return false;
|
||||
var parent = element.program.elements.get((<DeclarationStatement>parentNode).internalName);
|
||||
if (!parent)
|
||||
return false;
|
||||
return isModuleExport(parent, <DeclarationStatement>parentNode);
|
||||
}
|
||||
|
||||
/** Creates an inlined expression of a constant variable-like element. */
|
||||
function makeInlineConstant(element: VariableLikeElement, module: Module): ExpressionRef {
|
||||
assert(element.hasConstantValue);
|
||||
|
@ -180,7 +180,7 @@ export abstract class DiagnosticEmitter {
|
||||
this.diagnostics.push(message);
|
||||
if (!this.silentDiagnostics) {
|
||||
console.log(formatDiagnosticMessage(message, true, true) + "\n"); // temporary
|
||||
console.log(<string>new Error("stack").stack);
|
||||
// console.log(<string>new Error("stack").stack);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,7 @@ export class Program extends DiagnosticEmitter {
|
||||
types: Map<string,Type> = noTypesYet;
|
||||
/** Declared type aliases. */
|
||||
typeAliases: Map<string,TypeNode> = new Map();
|
||||
/** Exports of individual files by internal name. Not global exports. */
|
||||
/** Exports of individual files by exported internal name. Not global exports. */
|
||||
exports: Map<string,Element> = new Map();
|
||||
|
||||
/** Constructs a new program, optionally inheriting parser diagnostics. */
|
||||
@ -283,7 +283,7 @@ export class Program extends DiagnosticEmitter {
|
||||
}
|
||||
|
||||
private initializeClass(declaration: ClassDeclaration, queuedDerivedClasses: ClassPrototype[], namespace: Element | null = null): void {
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
@ -351,17 +351,17 @@ export class Program extends DiagnosticEmitter {
|
||||
|
||||
private initializeField(declaration: FieldDeclaration, classPrototype: ClassPrototype): void {
|
||||
var name = declaration.name.name;
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
|
||||
// static fields become global variables
|
||||
if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, declaration.internalName);
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
}
|
||||
if (classPrototype.members) {
|
||||
if (classPrototype.members.has(name)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, declaration.internalName);
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
}
|
||||
} else
|
||||
@ -374,7 +374,7 @@ export class Program extends DiagnosticEmitter {
|
||||
} else {
|
||||
if (classPrototype.instanceMembers) {
|
||||
if (classPrototype.instanceMembers.has(name)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, declaration.internalName);
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
}
|
||||
} else
|
||||
@ -386,19 +386,19 @@ export class Program extends DiagnosticEmitter {
|
||||
|
||||
private initializeMethod(declaration: MethodDeclaration, classPrototype: ClassPrototype): void {
|
||||
var name = declaration.name.name;
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
var instancePrototype: FunctionPrototype | null = null;
|
||||
|
||||
// static methods become global functions
|
||||
if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {
|
||||
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, declaration.internalName);
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
}
|
||||
if (classPrototype.members) {
|
||||
if (classPrototype.members.has(name)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, declaration.internalName);
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
}
|
||||
} else
|
||||
@ -411,7 +411,7 @@ export class Program extends DiagnosticEmitter {
|
||||
} else {
|
||||
if (classPrototype.instanceMembers) {
|
||||
if (classPrototype.instanceMembers.has(name)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, declaration.internalName);
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
}
|
||||
} else
|
||||
@ -470,7 +470,7 @@ export class Program extends DiagnosticEmitter {
|
||||
|
||||
private initializeAccessor(declaration: MethodDeclaration, classPrototype: ClassPrototype, isGetter: bool): void {
|
||||
var propertyName = declaration.name.name;
|
||||
var internalPropertyName = declaration.internalName;
|
||||
var internalPropertyName = declaration.fileLevelInternalName;
|
||||
|
||||
var propertyElement = this.elements.get(internalPropertyName);
|
||||
if (propertyElement) {
|
||||
@ -505,7 +505,7 @@ export class Program extends DiagnosticEmitter {
|
||||
var internalInstanceName = classPrototype.internalName + INSTANCE_DELIMITER + name;
|
||||
if (classPrototype.instanceMembers) {
|
||||
if (classPrototype.instanceMembers.has(name)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, declaration.internalName);
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalPropertyName);
|
||||
return;
|
||||
}
|
||||
} else
|
||||
@ -521,7 +521,7 @@ export class Program extends DiagnosticEmitter {
|
||||
}
|
||||
|
||||
private initializeEnum(declaration: EnumDeclaration, namespace: Element | null = null): void {
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
@ -556,7 +556,7 @@ export class Program extends DiagnosticEmitter {
|
||||
|
||||
private initializeEnumValue(declaration: EnumValueDeclaration, enm: Enum): void {
|
||||
var name = declaration.name.name;
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
if (enm.members) {
|
||||
if (enm.members.has(name)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
@ -649,7 +649,7 @@ export class Program extends DiagnosticEmitter {
|
||||
}
|
||||
|
||||
private initializeFunction(declaration: FunctionDeclaration, namespace: Element | null = null): void {
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
@ -694,7 +694,7 @@ export class Program extends DiagnosticEmitter {
|
||||
}
|
||||
|
||||
private initializeImport(declaration: ImportDeclaration, internalPath: string, queuedExports: Map<string,QueuedExport>, queuedImports: QueuedImport[]): void {
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
@ -739,7 +739,7 @@ export class Program extends DiagnosticEmitter {
|
||||
}
|
||||
|
||||
private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
return;
|
||||
@ -791,7 +791,7 @@ export class Program extends DiagnosticEmitter {
|
||||
}
|
||||
|
||||
private initializeNamespace(declaration: NamespaceDeclaration, queuedExtendingClasses: ClassPrototype[], parentNamespace: Element | null = null): void {
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
|
||||
var namespace = this.elements.get(internalName);
|
||||
if (!namespace) {
|
||||
@ -873,7 +873,7 @@ export class Program extends DiagnosticEmitter {
|
||||
var declarations = statement.declarations;
|
||||
for (var i = 0, k = declarations.length; i < k; ++i) {
|
||||
var declaration = declarations[i];
|
||||
var internalName = declaration.internalName;
|
||||
var internalName = declaration.fileLevelInternalName;
|
||||
if (this.elements.has(internalName)) {
|
||||
this.error(DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user