public override object VisitTypeDecl([NotNull] SLangGrammarParser.TypeDeclContext context) { checkDefinitions[context.Id().GetText()] = true; currentType = Table.FindClass(ModuleData.Name, context.Id().GetText()).TypeIdent; base.VisitTypeDecl(context); currentType = null; return(null); }
public override object VisitTypeDecl([NotNull] SLangGrammarParser.TypeDeclContext context) { var className = context.Id().GetText(); ThrowIfReservedWord(className, ModuleData.File, context.Id().Symbol); if (moduleTable.Classes.ContainsKey(className)) { ThrowClassRedefinitionException(className, ModuleData.File, context.Id().Symbol); } var isBase = context.Base() != null; var modifier = GetModifierByName(context.AccessModifier().GetText()); var classItem = new ClassNameTableItem { TypeIdent = new SlangCustomType(ModuleData.Name, className), CanBeBase = isBase, Column = context.Id().Symbol.Column, Line = context.Id().Symbol.Line, AccessModifier = modifier }; moduleTable.CheckCommonNamesConflicts(classItem.TypeIdent.Name, classItem.Line, classItem.Column); moduleTable.Classes[className] = classItem; return(base.VisitTypeDecl(context)); }
// declares public override object VisitTypeDecl([NotNull] SLangGrammarParser.TypeDeclContext context) { TranslateCustomType(context.Id().GetText()); return(null); }
public override object VisitTypeDecl([NotNull] SLangGrammarParser.TypeDeclContext context) { var classItem = moduleItem.Classes[context.Id().GetText()]; if (context.typeInherit() != null) { // Есть наследник classItem.Base = Visit(context.typeInherit().customType()) as SlangCustomType; } else { // Нету наследника, берем Object из System classItem.Base = Table.Modules[CompilerConstants.SystemModuleName].Classes[CompilerConstants.ObjectClassName].TypeIdent; CheckClassExists(CompilerConstants.SystemModuleName, CompilerConstants.ObjectClassName, context.Id().Symbol); } var errToken = context.Id().Symbol; if (classItem.Base != null && !Table.Modules[classItem.Base.ModuleName].Classes[classItem.Base.Name].CanBeBase) { ThrowClassNotMarkedAsBaseException(classItem.Base, ModuleData.File, errToken); } // store fields foreach (var fieldContext in context.typeFieldDecl()) { var item = Visit(fieldContext) as FieldNameTableItem; var expCtx = fieldContext.variableDecl().simpleDecl()?.exp() ?? fieldContext.variableDecl().ptrDecl()?.exp(); if (expCtx != null) { ThrowClassFieldExprException(ModuleData.File, expCtx.Start); } if (item != null) { ThrowIfReservedWord(item.Name, ModuleData.File, fieldContext.variableDecl().Start); if (classItem.Fields.ContainsKey(item.Name)) { ThrowClassFieldAlreadyDefinedException(item.Name, context.Id().GetText(), ModuleData.File, fieldContext.variableDecl().Start); } // check level of access if (item.Type is SlangCustomType || item.Type is SlangPointerType) { ClassNameTableItem usedType = null; if (item.Type is SlangCustomType t) { usedType = Table.FindClass(t); } else if (item.Type is SlangPointerType pt) { usedType = Table.FindClass(pt.PtrType); } // если поле класса публично, а тип поля приватный, но при этом тип поля не тип класса if (usedType != null && item.AccessModifier == AccessModifier.Public && usedType.AccessModifier == AccessModifier.Private && (!usedType.TypeIdent.Equals(classItem.TypeIdent))) { ThrowLevelAccessibilityForFieldsException(fieldContext.variableDecl().Start, ModuleData.File, usedType.TypeIdent.ToString(), item.Name); } } classItem.CheckFieldConflicts(ModuleData, item); classItem.Fields.Add(item.Name, item); } } return(base.VisitTypeDecl(context)); }