Beispiel #1
0
 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));
        }
Beispiel #3
0
 // 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));
        }