Ejemplo n.º 1
0
        /// <summary>
        /// Process local variable declaration.
        /// </summary>
        /// <param name="localVariableDeclaration">
        /// The local variable declaration.
        /// </param>
        private static void ProcessLocalVariableDeclaration(ILocalVariableDeclaration localVariableDeclaration)
        {
            IMultipleLocalVariableDeclaration multipleDeclaration = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(localVariableDeclaration);

            if (multipleDeclaration.Declarators.Count > 1)
            {
                IType newType = CSharpTypeFactory.CreateType(multipleDeclaration.TypeUsage);

                using (WriteLockCookie.Create(true))
                {
                    multipleDeclaration.SetTypeUsage(CSharpElementFactory.GetInstance(localVariableDeclaration.GetPsiModule()).CreateTypeUsageNode(newType));
                }
            }
            else
            {
                ILocalVariable variable = localVariableDeclaration.DeclaredElement;
                if (variable != null)
                {
                    if (!multipleDeclaration.IsVar)
                    {
                        using (WriteLockCookie.Create(true))
                        {
                            localVariableDeclaration.SetType(variable.Type);
                        }
                    }
                }
            }
        }
        public LocalVariableDeclarationCompiler(ILocalVariableDeclaration localVariableDeclaration,
                                                AbstractILCompilerParams @params) : base(@params)
        {
            myLocalVariableDeclaration = localVariableDeclaration;
            var variableName = myLocalVariableDeclaration.DeclaredName;

            myLocalVariableReference = MyParams.LocalVariableIndexer.GetNextVariable(variableName);
        }
Ejemplo n.º 3
0
        public override void VisitLocalVariableDeclaration(ILocalVariableDeclaration decl, IList <IStatement> body)
        {
            if (IsTargetMatch(decl, CompletionCase.EmptyCompletionBefore))
            {
                body.Add(EmptyCompletionExpression);
            }

            var       id = decl.DeclaredName;
            ITypeName type;

            try
            {
                type = decl.Type.GetName();
            }
            catch (AssertException)
            {
                // TODO this is an intermediate "fix"... the analysis sometimes fails here ("cannot create name for anonymous type")
                type = Names.UnknownType;
            }
            body.Add(SSTUtil.Declare(id, type));

            IAssignableExpression initializer = null;

            if (decl.Initial != null)
            {
                initializer = _exprVisitor.ToAssignableExpr(decl.Initial, body);
            }
            else if (_marker.HandlingNode == decl && _marker.Case == CompletionCase.InBody)
            {
                initializer = new CompletionExpression();
            }

            if (initializer != null)
            {
                if (!IsSelfAssign(id, initializer))
                {
                    body.Add(SSTUtil.AssignmentToLocal(id, initializer));
                }
            }

            if (decl == _marker.HandlingNode && _marker.Case == CompletionCase.EmptyCompletionAfter)
            {
                body.Add(EmptyCompletionExpression);
            }
        }
        private static (NamedElementKinds?, IReferenceName) GetKindAndDeclaration(ILocalVariableDeclaration localVarDeclaration, IFieldDeclaration fieldDeclaration,
                                                                                  IRegularParameterDeclaration regularParameterDeclaration)
        {
            NamedElementKinds?kind           = null;
            IReferenceName    scalarTypeName = null;

            if (localVarDeclaration != null)
            {
                kind           = NamedElementKinds.Locals;
                scalarTypeName = localVarDeclaration.GetScalarTypename();
            }

            else if (fieldDeclaration != null)
            {
                scalarTypeName = fieldDeclaration.GetScalarTypename();
                var isPrivate = fieldDeclaration.GetAccessRights().Has(AccessRights.PRIVATE);

                if (fieldDeclaration.IsStatic)
                {
                    if (isPrivate)
                    {
                        kind = fieldDeclaration.IsReadonly ? NamedElementKinds.PrivateStaticReadonly : NamedElementKinds.PrivateStaticFields;
                    }
                    else
                    {
                        kind = fieldDeclaration.IsReadonly ? NamedElementKinds.StaticReadonly : NamedElementKinds.PublicFields;
                    }
                }
                else
                {
                    kind = isPrivate ? NamedElementKinds.PrivateInstanceFields : NamedElementKinds.PublicFields;
                }
            }

            else if (regularParameterDeclaration != null)
            {
                kind           = NamedElementKinds.Parameters;
                scalarTypeName = regularParameterDeclaration.ScalarTypeName;
            }

            return(kind, scalarTypeName);
        }
        /// <summary>
        /// Inserts the assertion code.
        /// </summary>
        /// <param name="localVariableDeclaration">
        /// The local variable declaration.
        /// </param>
        private void CheckAssignment(ILocalVariableDeclaration localVariableDeclaration)
        {
            var localVariable = localVariableDeclaration.DeclaredElement as ILocalVariable;
              if (localVariable == null)
              {
            return;
              }

              IStatement anchor = null;

              ITreeNode treeNode = localVariableDeclaration.ToTreeNode();

              while (treeNode != null)
              {
            anchor = treeNode as IStatement;

            if (anchor != null)
            {
              break;
            }

            treeNode = treeNode.Parent;
              }

              if (anchor == null)
              {
            return;
              }

              CheckAssignment(localVariableDeclaration, anchor, localVariable.ShortName);
        }
        /// <summary>Inserts the assertion code.</summary>
        /// <param name="localVariableDeclaration">The local variable declaration.</param>
        private void InsertAssertionCode(ILocalVariableDeclaration localVariableDeclaration)
        {
            var localVariable = localVariableDeclaration.DeclaredElement as ILocalVariable;
              if (localVariable == null)
              {
            return;
              }

              this.InsertAssertionCode(localVariable.Type, localVariableDeclaration, localVariable.ShortName);
        }
        /// <summary>
        /// Process local variable declaration.
        /// </summary>
        /// <param name="localVariableDeclaration">
        /// The local variable declaration.
        /// </param>
        private static void ProcessLocalVariableDeclaration(ILocalVariableDeclaration localVariableDeclaration)
        {
            IMultipleLocalVariableDeclaration multipleDeclaration = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(localVariableDeclaration);

            if (multipleDeclaration.Declarators.Count > 1)
            {
                IType newType = CSharpTypeFactory.CreateType(multipleDeclaration.TypeUsage);

                using (WriteLockCookie.Create(true))
                {
                    multipleDeclaration.SetTypeUsage(CSharpElementFactory.GetInstance(localVariableDeclaration.GetPsiModule()).CreateTypeUsageNode(newType));
                }
            }
            else
            {
                ILocalVariable variable = localVariableDeclaration.DeclaredElement;
                if (variable != null)
                {
                    if (!multipleDeclaration.IsVar)
                    {
                        using (WriteLockCookie.Create(true))
                        {
                            localVariableDeclaration.SetType(variable.Type);
                        }
                    }
                }
            }
        }