internal override void ResolveVariableOrigins(ParserContext parser, VariableScope varIds, VariableIdAllocPhase phase) { this.IterationExpression.ResolveVariableOrigins(parser, varIds, phase); if ((phase & VariableIdAllocPhase.REGISTER) != 0) { varIds.RegisterVariable(this.IterationType, this.IterationVariable.Value); this.IndexLocalId = varIds.RegisterSyntheticVariable(AType.Integer(this.FirstToken)); this.ListLocalId = varIds.RegisterSyntheticVariable(AType.Any(this.FirstToken)); } if (phase != VariableIdAllocPhase.REGISTER_AND_ALLOC) { foreach (Executable ex in this.Code) { ex.ResolveVariableOrigins(parser, varIds, phase); } } else { foreach (Executable ex in this.Code) { ex.ResolveVariableOrigins(parser, varIds, VariableIdAllocPhase.REGISTER); } foreach (Executable ex in this.Code) { ex.ResolveVariableOrigins(parser, varIds, VariableIdAllocPhase.ALLOC); } } this.IterationVariableId = varIds.GetVarId(this.IterationVariable); }
internal override Expression Resolve(ParserContext parser) { for (int i = 0; i < this.Args.Length; ++i) { this.Args[i] = this.Args[i].Resolve(parser); } this.Root = this.Root.Resolve(parser); // TODO: this is hardcoded just for Math.floor(numeric constant). Eventually, it'd be nice // for a few common functions to have a compile-time codepath here. // e.g. Core.parseInt, Math.sin, etc. if (this.Root is FunctionReference) { FunctionDefinition funcDef = ((FunctionReference)this.Root).FunctionDefinition; IConstantValue cv = this.SimplifyFunctionCall(funcDef, this.Args); if (cv != null) { return((Expression)cv); } } if (this.Root is SpecialEntity) { if (this.Root is SpecialEntity.EnumMaxFunction) { int max = ((SpecialEntity.EnumMaxFunction) this.Root).GetMax(); return(new IntegerConstant(this.Root.FirstToken, max, this.Owner)); } if (this.Root is SpecialEntity.EnumValuesFunction) { int[] rawValues = ((SpecialEntity.EnumValuesFunction) this.Root).GetValues(); List <Expression> values = new List <Expression>(); foreach (int rawValue in rawValues) { values.Add(new IntegerConstant(this.Root.FirstToken, rawValue, this.Owner)); } return(new ListDefinition(this.FirstToken, values, AType.Integer(this.FirstToken), this.Owner, false, null)); } } return(this); }