/// <summary> /// Rewrites the type inside typeof. /// </summary> /// <param name="node">ExpressionStatementSyntax</param> /// <returns>SyntaxNode</returns> private SyntaxNode RewriteStatement(TypeOfExpressionSyntax node) { // Gets containing method. var methoddecl = node.Ancestors().OfType <MethodDeclarationSyntax>().FirstOrDefault(); if (methoddecl == null) { return(node); } // Gets containing class. var classdecl = methoddecl.Ancestors().OfType <ClassDeclarationSyntax>().FirstOrDefault(); if (classdecl == null) { return(node); } // Gets containing namespace. var namespacedecl = classdecl.Ancestors().OfType <NamespaceDeclarationSyntax>().FirstOrDefault(); if (namespacedecl == null) { return(node); } var key = Tuple.Create(methoddecl.Identifier.ValueText, classdecl.Identifier.ValueText, namespacedecl.Name.ToString()); var rewrittenMethod = this.RewrittenQualifiedMethods.SingleOrDefault( val => val.Name.Equals(methoddecl.Identifier.ValueText) && val.MachineName.Equals(classdecl.Identifier.ValueText) && val.NamespaceName.Equals(namespacedecl.Name.ToString())); if (rewrittenMethod == null) { return(node); } this.CurrentAllQualifiedStateNames = rewrittenMethod.MachineQualifiedStateNames; this.CurrentQualifiedStateName = rewrittenMethod.QualifiedStateName; var typeUsed = node.Type.ToString(); var fullyQualifiedName = this.GetFullyQualifiedStateName(typeUsed); if (fullyQualifiedName == typeUsed) { return(node); } var tokenizedName = this.ToTokens(fullyQualifiedName); var rewritten = SyntaxFactory.ParseExpression("typeof(" + fullyQualifiedName + ")"); rewritten = rewritten.WithTriviaFrom(node); return(rewritten); }
/// <summary> /// Rewrites the type inside typeof. /// </summary> /// <param name="node">ExpressionStatementSyntax</param> /// <returns>SyntaxNode</returns> private SyntaxNode RewriteStatement(TypeOfExpressionSyntax node) { // Gets containing method. var methoddecl = node.Ancestors().OfType <MethodDeclarationSyntax>().FirstOrDefault(); if (methoddecl == null) { return(node); } // Gets containing class. var classdecl = methoddecl.Ancestors().OfType <ClassDeclarationSyntax>().FirstOrDefault(); if (classdecl == null) { return(node); } // Gets containing namespace. var namespacedecl = classdecl.Ancestors().OfType <NamespaceDeclarationSyntax>().FirstOrDefault(); if (namespacedecl == null) { return(node); } var key = Tuple.Create(methoddecl.Identifier.ValueText, classdecl.Identifier.ValueText, namespacedecl.Name.ToString()); var rewrittenMethods = this.RewrittenQualifiedMethods.Where( val => val.Name.Equals(methoddecl.Identifier.ValueText) && val.MachineName.Equals(classdecl.Identifier.ValueText) && val.NamespaceName.Equals(namespacedecl.Name.ToString())).ToList(); // Must be unique. if (rewrittenMethods.Count == 0) { return(node); } if (rewrittenMethods.Count > 1) { throw new RewritingException( string.Format("Multiple definitions of the same method {0} in namespace {1}, machine {2}", methoddecl.Identifier.ValueText, namespacedecl.Name.ToString(), classdecl.Identifier.ValueText) ); } var rewrittenMethod = rewrittenMethods.First(); this.CurrentAllQualifiedStateNames = rewrittenMethod.MachineQualifiedStateNames; this.CurrentQualifiedStateName = rewrittenMethod.QualifiedStateName; var typeUsed = node.Type.ToString(); var fullyQualifiedName = this.GetFullyQualifiedStateName(typeUsed); if (fullyQualifiedName == typeUsed) { return(node); } var tokenizedName = this.ToTokens(fullyQualifiedName); var rewritten = SyntaxFactory.ParseExpression("typeof(" + fullyQualifiedName + ")"); rewritten = rewritten.WithTriviaFrom(node); return(rewritten); }
/// <summary> /// Rewrites the type inside typeof. /// </summary> /// <param name="node">ExpressionStatementSyntax</param> /// <returns>SyntaxNode</returns> private SyntaxNode RewriteStatement(TypeOfExpressionSyntax node) { // Gets containing method. var methoddecl = node.Ancestors().OfType<MethodDeclarationSyntax>().FirstOrDefault(); if (methoddecl == null) { return node; } // Gets containing class. var classdecl = methoddecl.Ancestors().OfType<ClassDeclarationSyntax>().FirstOrDefault(); if (classdecl == null) { return node; } // Gets containing namespace. var namespacedecl = classdecl.Ancestors().OfType<NamespaceDeclarationSyntax>().FirstOrDefault(); if (namespacedecl == null) { return node; } var key = Tuple.Create(methoddecl.Identifier.ValueText, classdecl.Identifier.ValueText, namespacedecl.Name.ToString()); var rewrittenMethod = this.RewrittenQualifiedMethods.SingleOrDefault( val => val.Name.Equals(methoddecl.Identifier.ValueText) && val.MachineName.Equals(classdecl.Identifier.ValueText) && val.NamespaceName.Equals(namespacedecl.Name.ToString())); if (rewrittenMethod == null) { return node; } this.CurrentAllQualifiedStateNames = rewrittenMethod.MachineQualifiedStateNames; this.CurrentQualifiedStateName = rewrittenMethod.QualifiedStateName; var typeUsed = node.Type.ToString(); var fullyQualifiedName = this.GetFullyQualifiedStateName(typeUsed); if (fullyQualifiedName == typeUsed) { return node; } var tokenizedName = this.ToTokens(fullyQualifiedName); var rewritten = SyntaxFactory.ParseExpression("typeof(" + fullyQualifiedName + ")"); rewritten = rewritten.WithTriviaFrom(node); return rewritten; }