private void HandleUseType(AstUsingStmt use) { switch (use.Value.Value as CheezType) { case EnumType e: { var decl = e.Declaration; ComputeEnumMembers(decl); foreach (var m in decl.Members) { var eve = new AstEnumValueExpr(e.Declaration, m); use.Scope.DefineUse(m.Name, eve, true, out var u); } break; } case GenericEnumType e: { var decl = e.Declaration; ComputeEnumMembers(decl); foreach (var m in decl.Members) { var eve = new AstEnumValueExpr(decl, m); use.Scope.DefineUse(m.Name, eve, true, out var u); } break; } default: ReportError(use, $"Can't use type '{use.Value.Value}'"); break; } }
public override NodeFinderResult VisitUsingStmt(AstUsingStmt use, int i = 0) { if (GetRelativeLocation(use.Value.Location, i) == RelativeLocation.Same) { return(use.Value.Accept(this, i)); } return(new NodeFinderResult(use.Scope, stmt: use)); }
private AstUsingStmt AnalyseUseStatement(AstUsingStmt use) { use.Value.SetFlag(ExprFlags.ValueRequired, true); use.Value.AttachTo(use); use.Value = InferType(use.Value, null); if (use.Value.Type.IsErrorType) { return(use); } switch (use.Value.Type) { case CheezTypeType type: HandleUseType(use); break; case StructType str: { var tempVar = use.Value; //if (!tempVar.GetFlag(ExprFlags.IsLValue)) { tempVar = new AstTempVarExpr(use.Value, use.Value.GetFlag(ExprFlags.IsLValue)); tempVar.Replace(use.Value); tempVar.SetFlag(ExprFlags.IsLValue, true); tempVar = InferType(tempVar, use.Value.Type); use.Value = tempVar; } ComputeStructMembers(str.Declaration); foreach (var mem in str.Declaration.Members) { AstExpression expr = new AstDotExpr(tempVar, new AstIdExpr(mem.Name, false, use.Location), use.Location); //expr = InferType(expr, null); use.Scope.DefineUse(mem.Name, expr, true, out var u); } } break; default: ReportError(use, $"Can't use value of type '{use.Value.Type}'"); break; } return(use); }
public override string VisitUsingStmt(AstUsingStmt use, int data = 0) { return($"use {use.Value.Accept(this)}"); }
public virtual ReturnType VisitUsingStmt(AstUsingStmt stmt, DataType data = default) => default;