/// <summary> /// Gets and converts preprocessor directive. /// </summary> /// <param name="preprocessorSymbol"> /// The preprocessor symbol. /// </param> /// <param name="parent"> /// The parent code part. /// </param> /// <param name="generated"> /// Indicates whether the preprocessor directive lies within a block of generated code. /// </param> /// <returns> /// Returns the preprocessor directive. /// </returns> private Preprocessor GetPreprocessorDirectiveToken(Symbol preprocessorSymbol, Reference<ICodePart> parent, bool generated) { Param.AssertNotNull(preprocessorSymbol, "preprocessorSymbol"); Param.AssertNotNull(parent, "parent"); Param.Ignore(generated); Debug.Assert(preprocessorSymbol != null && preprocessorSymbol.SymbolType == SymbolType.PreprocessorDirective, "Expected a preprocessor directive"); // Get the type of the preprocessor directive. int bodyIndex; string type = CsParser.GetPreprocessorDirectiveType(preprocessorSymbol, out bodyIndex); if (type == null) { throw new SyntaxException(this.document.SourceCode, preprocessorSymbol.LineNumber); } // Create the correct preprocessor object type. Preprocessor preprocessor = null; if (type == "region") { Region region = new Region(preprocessorSymbol.Text, preprocessorSymbol.Location, parent, true, generated); this.symbols.PushRegion(region); preprocessor = region; } else if (type == "endregion") { Region endregion = new Region(preprocessorSymbol.Text, preprocessorSymbol.Location, parent, false, generated); Region startregion = this.symbols.PopRegion(); if (startregion == null) { throw new SyntaxException(this.document.SourceCode, preprocessorSymbol.LineNumber); } startregion.Partner = endregion; endregion.Partner = startregion; preprocessor = endregion; } else if (type == "if") { preprocessor = this.GetConditionalCompilationDirective(preprocessorSymbol, ConditionalCompilationDirectiveType.If, bodyIndex, parent, generated); } else if (type == "elif") { preprocessor = this.GetConditionalCompilationDirective(preprocessorSymbol, ConditionalCompilationDirectiveType.Elif, bodyIndex, parent, generated); } else if (type == "else") { preprocessor = this.GetConditionalCompilationDirective(preprocessorSymbol, ConditionalCompilationDirectiveType.Else, bodyIndex, parent, generated); } else if (type == "endif") { preprocessor = this.GetConditionalCompilationDirective(preprocessorSymbol, ConditionalCompilationDirectiveType.Endif, bodyIndex, parent, generated); } else { preprocessor = new Preprocessor(preprocessorSymbol.Text, preprocessorSymbol.Location, parent, generated); } return preprocessor; }
/// <summary> /// Pushes a region onto the region stack. /// </summary> /// <param name="region"> /// The region to add. /// </param> public void PushRegion(Region region) { Param.AssertNotNull(region, "region"); this.regions.Push(region); if (region.IsGeneratedCodeRegion) { this.IncrementGeneratedCodeBlocks(); } }