public override SyntaxNode VisitParameter(ParameterSyntax node) { bool isRef = node.Modifiers.Count(m => m.Kind() == SyntaxKind.RefKeyword) > 0; if (isRef) { throw new NotImplementedException("Virtualization: No support for REF parameter"); } bool isOut = node.Modifiers.Count(m => m.Kind() == SyntaxKind.OutKeyword) > 0; if (isOut) { throw new NotImplementedException("Virtualization: No support for OUT parameter"); } int index = _virtualizationContext.DataIndex; string name = node.Identifier.ToString(); SyntaxAnnotation indexMarker = new SyntaxAnnotation("index", index + ""); SyntaxAnnotation nameMarker = new SyntaxAnnotation("name", name); SyntaxAnnotation variableMarker = new SyntaxAnnotation("type", "variable"); SyntaxAnnotation codeIndexMarker = new SyntaxAnnotation("code", "undefined"); SyntaxAnnotation uniqueMarker = new SyntaxAnnotation("unique", "" + VirtualizationContext.UniqueId); var initializer = SyntaxFactory.IdentifierName(name); var virtualData = new VirtualData(); virtualData.Type = node.Type.ToString(); virtualData.Index = index; virtualData.Name = name; virtualData.Annotations.Add(indexMarker); virtualData.Annotations.Add(nameMarker); virtualData.Annotations.Add(variableMarker); virtualData.Annotations.Add(codeIndexMarker); virtualData.Annotations.Add(uniqueMarker); virtualData.DefaultValue = initializer; _virtualizationContext.data.Add(virtualData); return(node); }
public override SyntaxNode VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node) { var declaration = node; List <StatementSyntax> statements = new List <StatementSyntax>(); markedNodes.Add(node); foreach (var variable in declaration.Declaration.Variables) { int index = _virtualizationContext.DataIndex; string name = variable.Identifier.Text; SyntaxAnnotation indexMarker = new SyntaxAnnotation("index", index + ""); SyntaxAnnotation nameMarker = new SyntaxAnnotation("name", name); SyntaxAnnotation variableMarker = new SyntaxAnnotation("type", "variable"); SyntaxAnnotation codeIndexMarker = new SyntaxAnnotation("code", "undefined"); SyntaxAnnotation uniqueMarker = new SyntaxAnnotation("unique", "" + VirtualizationContext.UniqueId); var virtualData = new VirtualData(); virtualData.Type = declaration.Declaration.Type.ToString(); virtualData.Index = index; virtualData.Name = name; virtualData.Annotations.Add(indexMarker); virtualData.Annotations.Add(nameMarker); virtualData.Annotations.Add(variableMarker); virtualData.Annotations.Add(codeIndexMarker); virtualData.Annotations.Add(uniqueMarker); _virtualizationContext.data.Add(virtualData); //TODO: split for multiple variables in the same declaration var initializer = variable.Initializer; if (initializer == null) { continue; } SyntaxNode rightValue; rightValue = initializer.DescendantNodes().First(); ExpressionStatementSyntax newNode; if (SyntaxFactoryExtensions.IsBasicType(virtualData.Type)) { newNode = SyntaxFactoryExtensions.DataVirtualAssignment(rightValue, virtualData.Annotations.ToArray()) .WithLeadingTrivia(declaration.GetLeadingTrivia()) .WithTrailingTrivia(declaration.GetTrailingTrivia()) ; } else { newNode = SyntaxFactoryExtensions.DataVirtualAssignment(virtualData.Type, rightValue, virtualData.Annotations.ToArray()) .WithLeadingTrivia(declaration.GetLeadingTrivia()) .WithTrailingTrivia(declaration.GetTrailingTrivia()) ; } virtualData.Node = newNode; virtualData.Statement = newNode; statements.Add(newNode); } replacementNodes.Add(new Tuple <LocalDeclarationStatementSyntax, List <StatementSyntax> >(node, statements)); return(node); }