public ForeachAction(ParseInfo parseInfo, Scope scope, DeltinScriptParser.ForeachContext foreachContext) { Scope varScope = scope.Child(); ForeachVar = new Var(foreachContext.name.Text, new Location(parseInfo.Script.Uri, DocRange.GetRange(foreachContext.name)), parseInfo); ForeachVar.VariableType = VariableType.ElementReference; ForeachVar.CodeType = CodeType.GetCodeTypeFromContext(parseInfo, foreachContext.code_type()); ForeachVar.Finalize(varScope); // Get the array that will be iterated on. Syntax error if it is missing. if (foreachContext.expr() != null) { Array = DeltinScript.GetExpression(parseInfo, scope, foreachContext.expr()); } else { parseInfo.Script.Diagnostics.Error("Expected expression.", DocRange.GetRange(foreachContext.IN())); } // Get the foreach block. Syntax error if it is missing. if (foreachContext.block() != null) { Block = new BlockAction(parseInfo, varScope, foreachContext.block()); // Get the path info. Path = new PathInfo(Block, DocRange.GetRange(foreachContext.FOREACH()), false); } else { parseInfo.Script.Diagnostics.Error("Expected block.", DocRange.GetRange(foreachContext.RIGHT_PAREN())); } }
public DefinedType(ParseInfo parseInfo, Scope scope, DeltinScriptParser.Type_defineContext typeContext, List <IApplyBlock> applyMethods) : base(typeContext.name.Text) { this.translateInfo = parseInfo.TranslateInfo; if (translateInfo.IsCodeType(Name)) { parseInfo.Script.Diagnostics.Error($"A type with the name '{Name}' already exists.", DocRange.GetRange(typeContext.name)); } DefinedAt = new LanguageServer.Location(parseInfo.Script.Uri, DocRange.GetRange(typeContext.name)); translateInfo.AddSymbolLink(this, DefinedAt); if (typeContext.CLASS() != null) { TypeKind = TypeKind.Class; TypeKindString = "class"; } else if (typeContext.STRUCT() != null) { TypeKind = TypeKind.Struct; TypeKindString = "struct"; } else { throw new NotImplementedException(); } staticScope = translateInfo.GlobalScope.Child(TypeKindString + " " + Name); objectScope = staticScope.Child(TypeKindString + " " + Name); // Get the variables defined in the type. foreach (var definedVariable in typeContext.define()) { Var newVar = Var.CreateVarFromContext(VariableDefineType.InClass, parseInfo, definedVariable); newVar.Finalize(UseScope(newVar.Static)); if (!newVar.Static) { objectVariables.Add(newVar); } } // Todo: Static methods/macros. foreach (var definedMethod in typeContext.define_method()) { var newMethod = new DefinedMethod(parseInfo, UseScope(false), definedMethod); applyMethods.Add(newMethod); } foreach (var macroContext in typeContext.define_macro()) { DeltinScript.GetMacro(parseInfo, UseScope(false), macroContext, applyMethods); } // Get the constructors. if (typeContext.constructor().Length > 0) { Constructors = new Constructor[typeContext.constructor().Length]; for (int i = 0; i < Constructors.Length; i++) { Constructors[i] = new DefinedConstructor(parseInfo, this, typeContext.constructor(i)); applyMethods.Add((DefinedConstructor)Constructors[i]); } } else { // If there are no constructors, create a default constructor. Constructors = new Constructor[] { new Constructor(this, new Location(parseInfo.Script.Uri, DocRange.GetRange(typeContext.name)), AccessLevel.Public) }; } }