예제 #1
0
        public override void VisitDestructorDeclaration(DestructorDeclarationSyntax node)
        {
            DestructorWalker walker = this.CreateSyntaxWalker<DestructorWalker>(node);
            walker.Visit(node);
            this.Destructors.Add(walker);

            base.VisitDestructorDeclaration(node);
        }
 public override SyntaxNode VisitDestructorDeclaration(DestructorDeclarationSyntax node)
 {
     if (node == null)
         return null;
     var symbol = _semanticModel.GetDeclaredSymbol(node);
     node = (DestructorDeclarationSyntax)base.VisitDestructorDeclaration(node);
     if (!IsPrivateOrInternal(symbol.DeclaredAccessibility))
         node = (DestructorDeclarationSyntax)ApplyDocComment(node, symbol.GetDocumentationCommentId());
     return node;
 }
        public static void WriteDestructor(OutputWriter writer, DestructorDeclarationSyntax destructor)
        {
            if (destructor.Body == null)
                return;

            writer.WriteLine("~this()");
            writer.OpenBrace();

            if (destructor.Body != null)
            {
                foreach (var statement in destructor.Body.As<BlockSyntax>().Statements)
                    Core.Write(writer, statement);
            }

            writer.CloseBrace();
        }
예제 #4
0
        internal SourceDestructorSymbol(
            SourceMemberContainerTypeSymbol containingType,
            DestructorDeclarationSyntax syntax,
            DiagnosticBag diagnostics) :
            base(containingType, syntax.GetReference(), syntax.Body?.GetReference() ?? syntax.ExpressionBody?.GetReference() , syntax.Identifier.GetLocation())
        {
            const MethodKind methodKind = MethodKind.Destructor;
            Location location = this.Locations[0];

            bool modifierErrors;
            var declarationModifiers = MakeModifiers(syntax.Modifiers, location, diagnostics, out modifierErrors);
            this.MakeFlags(methodKind, declarationModifiers, returnsVoid: true, isExtensionMethod: false);

            bool hasBlockBody = syntax.Body != null;
            _isExpressionBodied = !hasBlockBody && syntax.ExpressionBody != null;

            if (hasBlockBody || _isExpressionBodied)
            {
                if (IsExtern)
                {
                    diagnostics.Add(ErrorCode.ERR_ExternHasBody, location, this);
                }
            }

            if (!modifierErrors && bodySyntaxReferenceOpt == null && !IsExtern)
            {
                diagnostics.Add(ErrorCode.ERR_ConcreteMissingBody, location, this);
            }

            Debug.Assert(syntax.ParameterList.Parameters.Count == 0);

            if (containingType.IsStatic)
            {
                diagnostics.Add(ErrorCode.ERR_DestructorInStaticClass, location, this);
            }
            else if (!containingType.IsReferenceType)
            {
                diagnostics.Add(ErrorCode.ERR_OnlyClassesCanContainDestructors, location, this);
            }
        }
예제 #5
0
		private static void AppendMethodIdentifier(DestructorDeclarationSyntax syntax, StringBuilder builder)
		{
			builder.Append(syntax.Identifier.ValueText);
		}
예제 #6
0
		private static string GetDestructorSignatureString(DestructorDeclarationSyntax syntax)
		{
			var builder = new StringBuilder();
			AppendMethodIdentifier(syntax, builder);
			return builder.ToString();
		}
예제 #7
0
 public override SyntaxNode VisitDestructorDeclaration(DestructorDeclarationSyntax node)
 {
     this.AppendCompileIssue(node, IssueType.Error, IssueId.DestructorNotSupport);
     return node;
 }
예제 #8
0
파일: Chunk.cs 프로젝트: LaxLacks/ls2csc
 public void AddFunction(DestructorDeclarationSyntax node, SemanticModel Model)
 {
     IMethodSymbol ms = Model.GetDeclaredSymbol(node);
     AddFunction(ms, Model);
 }
예제 #9
0
		public override void VisitDestructorDeclaration(DestructorDeclarationSyntax node)
		{
			_members.Add(node);
		}
예제 #10
0
 public override void VisitDestructorDeclaration(DestructorDeclarationSyntax node)
 {
     base.VisitDestructorDeclaration(node);
     Chunk.AddFunction(node, Model);
 }
			public override void VisitDestructorDeclaration (DestructorDeclarationSyntax node)
			{
				base.VisitDestructorDeclaration (node);
				Append (node);
			}
예제 #12
0
        public static string DestructorDeclaration(DestructorDeclarationSyntax destructor)
        {
            var parsedAttributes = ParseAttributes(destructor.AttributeLists);

            var output = parsedAttributes.Item1;

            return output + "deinit " + Block(destructor.Body);
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="node"></param>
 public override sealed void VisitDestructorDeclaration(DestructorDeclarationSyntax node)
 {
     this.OnNodeVisited(node, this.type.IsInstanceOfType(node));
     base.VisitDestructorDeclaration(node);
 }
예제 #14
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="node"></param>
 public override sealed void VisitDestructorDeclaration(DestructorDeclarationSyntax node)
 {
     this.OnNodeVisited(node);
     if (!this.traverseRootOnly) base.VisitDestructorDeclaration(node);
 }
예제 #15
0
 public override void VisitDestructorDeclaration(DestructorDeclarationSyntax node)
 {
     VisitBlock(node.Body);
 }
 public override void VisitDestructorDeclaration(DestructorDeclarationSyntax node)
 {
     CheckXmlDocForErrors(node, semanticModel.GetDeclaredSymbol(node));
 }
 private void ClassifyUpdate(DestructorDeclarationSyntax oldNode, DestructorDeclarationSyntax newNode)
 {
     ClassifyMethodBodyRudeUpdate(
         oldNode.Body,
         newNode.Body,
         containingMethodOpt: null,
         containingType: (TypeDeclarationSyntax)newNode.Parent);
 }
예제 #18
0
        private Destructor TransverseDestructors(DestructorDeclarationSyntax dds)
        {
            Destructor retDestructor = new Destructor();
            //public int DecisionsCount { get; }
            //public int ExitPoints { get; set; }
            //public bool IsFriend { get; }
            //public bool IsPolymophic { get; }
            //public bool IsPublic { get; }
            //public bool IsStatic { get; }
            //public List<Preprocessor> Preprocessors { get; set; }
            retDestructor.Name = dds.Identifier.ValueText;

            if (dds.HasLeadingTrivia)
            {
                SetOuterComments(retDestructor, dds.GetLeadingTrivia().ToFullString());
            }

            if (dds.HasTrailingTrivia)
            {
                SetInnerComments(retDestructor, dds.GetTrailingTrivia().ToFullString());
            }

            foreach (SyntaxToken st in dds.Modifiers)
            {
                string modifier = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(st.ValueText);
                Encapsulation encap;
                Qualifiers qual;
                if (System.Enum.TryParse<Encapsulation>(modifier, out encap))
                {
                    retDestructor.Encapsulation.Add(encap);
                }
                else if (System.Enum.TryParse<Qualifiers>(modifier, out qual))
                {
                    retDestructor.Qualifiers.Add(qual);
                }
            }

            //TypeSyntax ts = cds.ReturnType;
            //Model.Type retType = new Model.Type();
            //retType.Name = ts.ToString();
            //retType.IsKnownType = ts.Kind.IsKeywordKind();
            //retType.IsNotUserDefined = ts.Kind.IsKeywordKind();
            //TODO
            //rettype.generictype
            //retDestructor.ReturnType = retType;

            ParameterListSyntax pls = dds.ParameterList;
            foreach (ParameterSyntax ps in pls.Parameters)
            {
                retDestructor.Parameters.Add(TraverseParamaters(ps));
            }
            BlockSyntax bs = dds.Body;
            var labelStatements = from aLabelStatement in bs.ChildNodes().OfType<LabeledStatementSyntax>() select aLabelStatement;
            foreach (LabeledStatementSyntax lss in labelStatements)
            {
                retDestructor.LabelStatements.Add(TraverseLabelStatements(lss));
            }

            var goToStatements = from aGoToStatement in bs.ChildNodes().OfType<GotoStatementSyntax>() select aGoToStatement;
            foreach (GotoStatementSyntax gtss in goToStatements)
            {
                GoTo gt = TraverseGoToStatements(gtss);
                retDestructor.GoToStatements.Add(gt);
            }

            //Preprocessors = new List<Preprocessor>();
            //Base = new List<InvokedMethod>();
            //Decisions = new Decisions();

            var accessVarsDecl = from aAccessVarsDecl in bs.ChildNodes().OfType<LocalDeclarationStatementSyntax>() select aAccessVarsDecl;
            foreach (LocalDeclarationStatementSyntax ldss in accessVarsDecl)
            {
                Method tempMethod = TransverseAccessVars(ldss);
                retDestructor.AccessedVariables.AddRange(tempMethod.AccessedVariables);
                retDestructor.InvokedMethods.AddRange(tempMethod.InvokedMethods);
            }

            var ifStatements = from aIfStatement in bs.ChildNodes().OfType<IfStatementSyntax>() select aIfStatement;
            foreach (IfStatementSyntax iss in ifStatements)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseIfStatements(iss, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var elseStatements = from aElseStatements in bs.ChildNodes().OfType<ElseClauseSyntax>() select aElseStatements;
            foreach (ElseClauseSyntax ecs in elseStatements)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseElseClauses(ecs, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var whileLoops = from aWhileLoop in bs.ChildNodes().OfType<WhileStatementSyntax>() select aWhileLoop;
            foreach (WhileStatementSyntax wss in whileLoops)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseWhileLoops(wss, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var doWhileLoops = from aDoWhileLoop in bs.ChildNodes().OfType<DoStatementSyntax>() select aDoWhileLoop;
            foreach (DoStatementSyntax dss in doWhileLoops)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseDoStatements(dss, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var forLoops = from aForLoop in bs.ChildNodes().OfType<ForStatementSyntax>() select aForLoop;
            foreach (ForStatementSyntax fss in forLoops)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseForStatements(fss, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var foreachLoops = from aForeachLoop in bs.ChildNodes().OfType<ForEachStatementSyntax>() select aForeachLoop;
            foreach (ForEachStatementSyntax fess in foreachLoops)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseForEachStatements(fess, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var switches = from aSwitch in bs.ChildNodes().OfType<SwitchStatementSyntax>() select aSwitch;
            foreach (SwitchStatementSyntax sss in switches)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseSwitchStatements(sss, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var catches = from aCatch in bs.ChildNodes().OfType<CatchClauseSyntax>() select aCatch;
            foreach (CatchClauseSyntax ccs in catches)
            {
                int exitPoints = retDestructor.ExitPoints;
                Decisions tempDecision = TraverseCatchClauses(ccs, ref exitPoints);
                retDestructor.Decisions.IfStatements.AddRange(tempDecision.IfStatements);
                retDestructor.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements);
                retDestructor.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements);
                retDestructor.Decisions.ForStatements.AddRange(tempDecision.ForStatements);
                retDestructor.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops);
                retDestructor.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops);
                retDestructor.Decisions.Catches.AddRange(tempDecision.Catches);
                retDestructor.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements);
                retDestructor.ExitPoints = exitPoints;
            }
            var breaks = from aBreak in bs.ChildNodes().OfType<BreakStatementSyntax>() select aBreak;
            foreach (BreakStatementSyntax bss in breaks)
            {
                //TODO get breaks
                //note that breaks are NOT in retMethod.Decisions
            }
            var checks = from aCheck in bs.ChildNodes().OfType<CheckedStatementSyntax>() select aCheck;
            foreach (CheckedStatementSyntax css in checks)
            {
                //TODO get checks
                //note that checks are NOT in retMethod.Decisions
            }
            var continues = from aContinue in bs.ChildNodes().OfType<ContinueStatementSyntax>() select aContinue;
            foreach (ContinueStatementSyntax css in continues)
            {
                //TODO get continues
                //note that continues are NOT in retMethod.Decisions
            }
            var emptys = from aEmpty in bs.ChildNodes().OfType<EmptyStatementSyntax>() select aEmpty;
            foreach (EmptyStatementSyntax ess in emptys)
            {
                //TODO get emptys
                //note that emptys are NOT in retMethod.Decisions
            }
            var exprs = from aExpr in bs.ChildNodes().OfType<ExpressionStatementSyntax>() select aExpr;
            foreach (ExpressionStatementSyntax ess in exprs)
            {
                //TODO get expressions
                //note that expressions are NOT in retMethod.Decisions
            }
            var fixeds = from aFixed in bs.ChildNodes().OfType<FixedStatementSyntax>() select aFixed;
            foreach (FixedStatementSyntax fss in fixeds)
            {
                //TODO get fixed
                //note that these are NOT in retMethod.Decisions
            }
            var locks = from aLock in bs.ChildNodes().OfType<LockStatementSyntax>() select aLock;
            foreach (LockStatementSyntax lss in locks)
            {
                //TODO get lock
                //note that these are NOT in retMethod.Decisions
            }
            var returns = from aReturn in bs.ChildNodes().OfType<ReturnStatementSyntax>() select aReturn;
            foreach (ReturnStatementSyntax rss in returns)
            {
                //TODO get returns
                //note that these are NOT in retMethod.Decisions
            }
            var throws = from aThrow in bs.ChildNodes().OfType<ThrowStatementSyntax>() select aThrow;
            foreach (ThrowStatementSyntax tss in throws)
            {
                //TODO get throws
                //note that these are NOT in retMethod.Decisions
            }
            var trys = from aTry in bs.ChildNodes().OfType<TryStatementSyntax>() select aTry;
            foreach (TryStatementSyntax tss in trys)
            {
                //TODO get trys
                //note that these are NOT in retMethod.Decisions
            }
            var unsafes = from aUnsafe in bs.ChildNodes().OfType<UnsafeStatementSyntax>() select aUnsafe;
            foreach (UnsafeStatementSyntax uss in unsafes)
            {
                //TODO get unsafes
                //note that these are NOT in retMethod.Decisions
            }
            var usings = from aUsing in bs.ChildNodes().OfType<UsingStatementSyntax>() select aUsing;
            foreach (UsingStatementSyntax uss in usings)
            {
                //TODO get usings
                //note that these are NOT in retMethod.Decisions
            }
            var yields = from aYield in bs.ChildNodes().OfType<YieldStatementSyntax>() select aYield;
            foreach (YieldStatementSyntax yss in yields)
            {
                //TODO get yields
                //note that these are NOT in retMethod.Decisions
            }
            var invokedMethods = from aInvokedMethod in bs.ChildNodes().OfType<InvocationExpressionSyntax>() select aInvokedMethod;
            foreach (InvocationExpressionSyntax ies in invokedMethods)
            {
                Method tempMethod = TraverseInvocationExpression(ies);
                retDestructor.InvokedMethods.AddRange(tempMethod.InvokedMethods);
                retDestructor.AccessedVariables.AddRange(tempMethod.AccessedVariables);
            }

            //InvokedMethods = new List<InvokedMethod>();
            return retDestructor;
        }