public override PLanguageType VisitNamedType(PParser.NamedTypeContext context) { string typeName = context.name.GetText(); if (scope.Lookup(typeName, out PEnum pEnum)) { return(new EnumType(pEnum)); } if (scope.Lookup(typeName, out TypeDef typeDef)) { if (visitedTypeDefs.Contains(typeDef)) { throw handler.CircularTypeDef(context.name, typeDef); } if (typeDef.Type == null) { visitedTypeDefs.Push(typeDef); switch (typeDef.SourceLocation) { case PParser.ForeignTypeDefContext foreignType: typeDef.Type = new ForeignType(foreignType.name.GetText()); break; case PParser.PTypeDefContext typedefDecl: typeDef.Type = Visit(typedefDecl.type()); break; case InterpreterRuleContext _: case RuleContextWithAltNum _: default: throw handler.InternalError(typeDef.SourceLocation, new ArgumentOutOfRangeException(nameof(context))); } visitedTypeDefs.Pop(); } return(new TypeDefType(typeDef)); } if (scope.Lookup(typeName, out NamedEventSet eventSet)) { return(new PermissionType(eventSet)); } if (scope.Lookup(typeName, out Interface pInterface)) { return(new PermissionType(pInterface)); } if (scope.Lookup(typeName, out Machine machine)) { return(new PermissionType(machine)); } throw handler.MissingDeclaration(context.name, "enum, typedef, event set, machine, or interface", typeName); }
public override PLanguageType VisitNamedType(PParser.NamedTypeContext context) { string typeName = context.name.GetText(); if (scope.Lookup(typeName, out PEnum pEnum)) { return(new EnumType(pEnum)); } if (scope.Lookup(typeName, out TypeDef typeDef)) { if (visitedTypeDefs.Contains(typeDef)) { throw handler.CircularTypeDef(context.name, typeDef); } if (typeDef.Type == null) { visitedTypeDefs.Add(typeDef); switch (typeDef.SourceLocation) { case PParser.ForeignTypeDefContext foreignType: typeDef.Type = new ForeignType(foreignType.name.GetText()); break; case PParser.PTypeDefContext typedefDecl: typeDef.Type = Visit(typedefDecl.type()); break; default: throw handler.InternalError(typeDef.SourceLocation, $"Grammar changed without updating {nameof(TypeVisitor)}"); } } return(new TypeDefType(typeDef)); } if (scope.Lookup(typeName, out NamedEventSet eventSet)) { return(new PermissionType(eventSet)); } if (scope.Lookup(typeName, out Interface pInterface)) { return(new PermissionType(pInterface)); } if (scope.Lookup(typeName, out Machine machine)) { return(new PermissionType(machine)); } throw handler.MissingDeclaration(context.name, "enum, typedef, event set, machine, or interface", typeName); }
public override object VisitNamedType(PParser.NamedTypeContext context) { return(null); }