Ejemplo n.º 1
0
		static void ReplaceWithInitializer(DeclarationStatement decl)
		{
			if (decl.Initializer == null) {
				decl.ReplaceBy(null);
			} else {
				ExpressionStatement statement = new ExpressionStatement(decl.LexicalInfo);
				statement.Expression = new BinaryExpression(decl.LexicalInfo, BinaryOperatorType.Assign,
				                                            new ReferenceExpression(decl.Declaration.LexicalInfo, decl.Declaration.Name),
				                                            decl.Initializer);
				decl.ReplaceBy(statement);
			}
		}
Ejemplo n.º 2
0
        public override void LeaveDeclarationStatement(DeclarationStatement node)
        {
            EnsureDeclarationType(node);
            AssertDeclarationName(node.Declaration);

            var type = GetDeclarationType(node);

            var localInfo = DeclareLocal(node, node.Declaration.Name, type);
            var loopLocal = localInfo as InternalLocal;
            if (null != loopLocal)
                loopLocal.OriginalDeclaration = node.Declaration;

            if (node.Initializer != null)
            {
                IType initializerType = GetExpressionType(node.Initializer);
                if (CheckDeclarationType(node.Declaration.Type))
                    AssertTypeCompatibility(node.Initializer, type, initializerType);

                if (TypeSystemServices.IsNullable(type) && !TypeSystemServices.IsNullable(initializerType))
                    BindNullableInitializer(node, node.Initializer, type);

                node.ReplaceBy(
                    new ExpressionStatement(
                        CodeBuilder.CreateAssignment(
                            node.LexicalInfo,
                            CodeBuilder.CreateReference(localInfo),
                            node.Initializer)));
            }
            else
                node.ReplaceBy(new ExpressionStatement(CreateDefaultLocalInitializer(node, localInfo)));
        }
Ejemplo n.º 3
0
        public override void LeaveDeclarationStatement(DeclarationStatement node)
        {
            IType type = GetDeclarationType(node);

            AssertDeclarationName(node.Declaration);

            IEntity localInfo = DeclareLocal(node, node.Declaration.Name, type);
            if (null != node.Initializer)
            {
                IType itype = GetExpressionType(node.Initializer);
                AssertTypeCompatibility(node.Initializer, type, itype);

                if (TypeSystemServices.IsNullable(type) && !TypeSystemServices.IsNullable(itype))
                {
                    BindNullableInitializer(node, node.Initializer, type);
                }

                node.ReplaceBy(
                    new ExpressionStatement(
                        CodeBuilder.CreateAssignment(
                            node.LexicalInfo,
                            CodeBuilder.CreateReference(localInfo),
                            node.Initializer)));
            }
            else
            {
                node.ReplaceBy(
                    new ExpressionStatement(
                        CreateDefaultLocalInitializer(node, localInfo)));
            }
        }