示例#1
0
        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;
            }
        }
示例#2
0
        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));
        }
示例#3
0
        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);
        }
示例#4
0
 public override string VisitUsingStmt(AstUsingStmt use, int data = 0)
 {
     return($"use {use.Value.Accept(this)}");
 }
示例#5
0
 public virtual ReturnType VisitUsingStmt(AstUsingStmt stmt, DataType data   = default) => default;