示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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;
        }