/// <summary> /// Extracts the body of the given preprocessor directive symbol, parses it, and returns the parsed expression. /// </summary> /// <param name="parser">The C# parser.</param> /// <param name="sourceCode">The source code containing the preprocessor directive symbol.</param> /// <param name="preprocessorSymbol">The preprocessor directive symbol.</param> /// <param name="startIndex">The index of the start of the expression body within the text string.</param> /// <returns>Returns the expression.</returns> internal static Expression GetConditionalPreprocessorBodyExpression( CsParser parser, SourceCode sourceCode, Symbol preprocessorSymbol, int startIndex) { Param.AssertNotNull(parser, "parser"); Param.AssertNotNull(sourceCode, "sourceCode"); Param.AssertNotNull(preprocessorSymbol, "preprocessorSymbol"); Param.AssertGreaterThanOrEqualToZero(startIndex, "startIndex"); Debug.Assert(preprocessorSymbol.SymbolType == SymbolType.PreprocessorDirective, "The symbol is not a preprocessor directive."); string text = preprocessorSymbol.Text.Substring(startIndex, preprocessorSymbol.Text.Length - startIndex).Trim(); if (text.Length > 0) { using (StringReader reader = new StringReader(text)) { // Extract the symbols within this text. CodeLexer lexer = new CodeLexer(parser, sourceCode, new CodeReader(reader)); List<Symbol> symbolList = lexer.GetSymbols(sourceCode, null); SymbolManager directiveSymbols = new SymbolManager(symbolList); CodeParser preprocessorBodyParser = new CodeParser(parser, directiveSymbols); // Parse these symbols to create the body expression. return preprocessorBodyParser.GetNextConditionalPreprocessorExpression(sourceCode); } } // The directive has no body. return null; }
/// <summary> /// Initializes a new instance of the CodeParser class. /// </summary> /// <param name="parser">The C# parser.</param> /// <param name="symbols">The symbols in the document to parse.</param> public CodeParser(CsParser parser, SymbolManager symbols) { Param.AssertNotNull(parser, "parser"); Param.AssertNotNull(symbols, "symbols"); this.parser = parser; this.symbols = symbols; }
/// <summary> /// Parses the contents of the document. /// </summary> internal void ParseDocument() { Debug.Assert(this.document == null, "A CodeParser instance may only be used once."); // Find the list of symbols in the document. List<Symbol> symbolList = this.lexer.GetSymbols( this.lexer.SourceCode, this.lexer.SourceCode.Project.Configuration); // Create the symbol manager class. this.symbols = new SymbolManager(symbolList); // Create the document object. this.document = new CsDocument(this.lexer.SourceCode, this.parser, this.tokens); var documentRootReference = new Reference<ICodePart>(); // Get the file header if it exists. FileHeader fileHeader = this.GetFileHeader(documentRootReference); // Let the symbol manager know if this document contains generated code. if (fileHeader.Generated) { this.symbols.IncrementGeneratedCodeBlocks(); } this.document.FileHeader = fileHeader; // Create a declaration for the root element. Declaration declaration = new Declaration( new CsTokenList(this.document.Tokens), Strings.Root, ElementType.Root, AccessModifierType.Public, new Dictionary<CsTokenType, CsToken>()); // Create the root element for the document. DocumentRoot root = new DocumentRoot(this.document, declaration, fileHeader.Generated); documentRootReference.Target = root; // Parse the contents of the document. this.ParseElementContainerBody(root, documentRootReference, this.parser.PartialElements, false); // Check if there are any tokens in the document. if (this.document.Tokens.Count > 0) { // Fill in the token list for the root element. root.Tokens = new CsTokenList( this.document.Tokens, this.document.Tokens.First, this.document.Tokens.Last); // Fill in the location for the element. root.Location = CsToken.JoinLocations(this.document.Tokens.First, this.document.Tokens.Last); } // Add the root element to the document. this.document.RootElement = root; // When in debug mode, ensure that all tokens are correctly mapped to a parent element. this.DebugValidateParentReferences(); }
public CodeParser(CsParser parser, SymbolManager symbols) { this.tokens = new MasterList<CsToken>(); this.parser = parser; this.symbols = symbols; }
internal void ParseDocument() { List<Symbol> symbols = this.lexer.GetSymbols(this.lexer.SourceCode, this.lexer.SourceCode.Project.Configuration); this.symbols = new SymbolManager(symbols); this.document = new CsDocument(this.lexer.SourceCode, this.parser, this.tokens); FileHeader fileHeader = this.GetFileHeader(); if (fileHeader.Generated) { this.symbols.IncrementGeneratedCodeBlocks(); } this.document.FileHeader = fileHeader; Declaration declaration = new Declaration(new CsTokenList(this.document.Tokens), Microsoft.StyleCop.CSharp.Strings.Root, ElementType.Root, AccessModifierType.Public, new Dictionary<CsTokenType, CsToken>()); DocumentRoot element = new DocumentRoot(this.document, declaration, fileHeader.Generated); this.ParseElementContainerBody(element, this.parser.PartialElements, false); if (this.document.Tokens.Count > 0) { element.Tokens = new CsTokenList(this.document.Tokens, this.document.Tokens.First, this.document.Tokens.Last); element.Location = CodeLocation.Join<CsToken>(this.document.Tokens.First, this.document.Tokens.Last); } this.document.RootElement = element; }
internal static Expression GetConditionalPreprocessorBodyExpression(CsParser parser, SourceCode sourceCode, Symbol preprocessorSymbol, int startIndex) { string s = preprocessorSymbol.Text.Substring(startIndex, preprocessorSymbol.Text.Length - startIndex).Trim(); if (s.Length > 0) { StringReader code = new StringReader(s); CodeLexer lexer = new CodeLexer(parser, sourceCode, new CodeReader(code)); SymbolManager symbols = new SymbolManager(lexer.GetSymbols(sourceCode, null)); CodeParser parser2 = new CodeParser(parser, symbols); return parser2.GetNextConditionalPreprocessorExpression(sourceCode); } return null; }