diff options
author | Lluis Sanchez Gual <lluis@xamarin.com> | 2015-04-20 19:07:51 +0300 |
---|---|---|
committer | Lluis Sanchez Gual <lluis@xamarin.com> | 2015-04-20 19:07:51 +0300 |
commit | 95408b1a41b31b645f3a8c3323ab7d3ca4bff26b (patch) | |
tree | f8f137cddcb9a40499d303be95722fd2c6081bce /main/src/addins/CSharpBinding/MonoDevelop.CSharp.Highlighting/CSharpSyntaxMode.cs | |
parent | b70e4e04b4e41b8ec28d7e4b220b401ecf467e7a (diff) | |
parent | de043d330a8bf5855d4d983c804cd36727cb2406 (diff) |
Merge remote-tracking branch 'origin/roslyn' into new-project-model
Diffstat (limited to 'main/src/addins/CSharpBinding/MonoDevelop.CSharp.Highlighting/CSharpSyntaxMode.cs')
-rw-r--r-- | main/src/addins/CSharpBinding/MonoDevelop.CSharp.Highlighting/CSharpSyntaxMode.cs | 716 |
1 files changed, 120 insertions, 596 deletions
diff --git a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Highlighting/CSharpSyntaxMode.cs b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Highlighting/CSharpSyntaxMode.cs index 22a1d5f330..80c29fe41d 100644 --- a/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Highlighting/CSharpSyntaxMode.cs +++ b/main/src/addins/CSharpBinding/MonoDevelop.CSharp.Highlighting/CSharpSyntaxMode.cs @@ -28,30 +28,17 @@ using System; using System.Linq; -using System.Collections.Generic; -using Mono.TextEditor.Highlighting; -using Mono.TextEditor; -using System.Xml; -using MonoDevelop.Projects; -using MonoDevelop.CSharp.Project; -using MonoDevelop.Ide.Gui; -using MonoDevelop.Ide; -using MonoDevelop.Ide.Tasks; -using ICSharpCode.NRefactory.CSharp; -using ICSharpCode.NRefactory.TypeSystem; +using Microsoft.CodeAnalysis; +using ICSharpCode.NRefactory6.CSharp.Analysis; +using Microsoft.CodeAnalysis.Text; using MonoDevelop.Ide.TypeSystem; -using ICSharpCode.NRefactory.CSharp.Resolver; -using ICSharpCode.NRefactory.Semantics; -using ICSharpCode.NRefactory.CSharp.TypeSystem; -using MonoDevelop.SourceEditor.QuickTasks; using System.Threading; -using System.Diagnostics; -using MonoDevelop.Core; -using ICSharpCode.NRefactory.CSharp.Analysis; -using ICSharpCode.NRefactory; -using MonoDevelop.Refactoring; -using ICSharpCode.NRefactory.Refactoring; - +using MonoDevelop.Ide.Editor; +using MonoDevelop.Ide.Editor.Highlighting; +using MonoDevelop.Core.Text; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CSharp; namespace MonoDevelop.CSharp.Highlighting { @@ -68,624 +55,161 @@ namespace MonoDevelop.CSharp.Highlighting return true; } } - - class CSharpSyntaxMode : SyntaxMode, IQuickTaskProvider, IDisposable - { - readonly Document guiDocument; - - CSharpAstResolver resolver; - CancellationTokenSource src; - public bool SemanticHighlightingEnabled { - get { - return true; - } - } + class CSharpSyntaxMode : SemanticHighlighting + { + HighlightingSegmentTree highlightTree; + CancellationTokenSource src = new CancellationTokenSource (); - internal class StyledTreeSegment : TreeSegment + public CSharpSyntaxMode (TextEditor editor, DocumentContext documentContext) : base (editor, documentContext) { - public string Style { - get; - private set; - } - - public StyledTreeSegment (int offset, int length, string style) : base (offset, length) - { - Style = style; - } + DocumentParsed (); } - - class HighlightingSegmentTree : SegmentTree<StyledTreeSegment> - { - public bool GetStyle (Chunk chunk, ref int endOffset, out string style) - { - var segment = GetSegmentsAt (chunk.Offset).FirstOrDefault (); - if (segment == null) { - style = null; - return false; - } - endOffset = segment.EndOffset; - style = segment.Style; - return true; - } - - public void AddStyle (int startOffset, int endOffset, string style) - { - if (IsDirty) - return; - Add (new StyledTreeSegment (startOffset, endOffset - startOffset, style)); - } - } - - Dictionary<DocumentLine, HighlightingVisitior> lineSegments = new Dictionary<DocumentLine, HighlightingVisitior> (); - public bool DisableConditionalHighlighting { - get; - set; - } + #region implemented abstract members of SemanticHighlighting - public static IEnumerable<string> GetDefinedSymbols (MonoDevelop.Projects.Project project) + protected override void DocumentParsed () { - var workspace = IdeApp.Workspace; - if (workspace == null || project == null) - yield break; - var configuration = project.GetConfiguration (workspace.ActiveConfiguration) as DotNetProjectConfiguration; - if (configuration != null) { - foreach (string s in configuration.GetDefineSymbols ()) - yield return s; - // Workaround for mcs defined symbol - if (configuration.TargetRuntime.RuntimeId == "Mono") - yield return "__MonoCS__"; - } - } - - void HandleDocumentParsed (object sender, EventArgs e) - { - if (src != null) - src.Cancel (); - resolver = null; - if (guiDocument.IsProjectContextInUpdate) { + var parsedDocument = documentContext.ParsedDocument; + if (parsedDocument == null) return; - } - if (guiDocument != null && SemanticHighlightingEnabled) { - var parsedDocument = guiDocument.ParsedDocument; - if (parsedDocument != null) { - if (guiDocument.Project != null && guiDocument.IsCompileableInProject) { - src = new CancellationTokenSource (); - var newResolverTask = guiDocument.GetSharedResolver (); - var cancellationToken = src.Token; - System.Threading.Tasks.Task.Factory.StartNew (delegate { - if (newResolverTask == null) - return; - var newResolver = newResolverTask.Result; - if (newResolver == null) - return; - var visitor = new QuickTaskVisitor (newResolver, cancellationToken); - try { - newResolver.RootNode.AcceptVisitor (visitor); - } catch (Exception ex) { - LoggingService.LogError ("Error while analyzing the file for the semantic highlighting.", ex); - return; - } - if (!cancellationToken.IsCancellationRequested) { - Gtk.Application.Invoke (delegate { - if (cancellationToken.IsCancellationRequested) - return; - var editorData = guiDocument.Editor; - if (editorData == null) - return; -// compilation = newResolver.Compilation; - resolver = newResolver; - quickTasks = visitor.QuickTasks; - OnTasksUpdated (EventArgs.Empty); - foreach (var kv in lineSegments) { - try { - kv.Value.tree.RemoveListener (); - } catch (Exception) { - } - } - lineSegments.Clear (); - var textEditor = editorData.Parent; - if (textEditor != null) { - if (!parsedDocument.HasErrors) { - var margin = textEditor.TextViewMargin; - margin.PurgeLayoutCache (); - textEditor.QueueDraw (); - } - } - }); - } - }, cancellationToken); - } - } - } - } - - class HighlightingVisitior : SemanticHighlightingVisitor<string> - { - readonly int lineNumber; - readonly int lineOffset; - readonly int lineLength; - internal HighlightingSegmentTree tree = new HighlightingSegmentTree (); - - public HighlightingVisitior (CSharpAstResolver resolver, CancellationToken cancellationToken, int lineNumber, int lineOffset, int lineLength) - { - if (resolver == null) - throw new ArgumentNullException ("resolver"); - this.resolver = resolver; - this.cancellationToken = cancellationToken; - this.lineNumber = lineNumber; - this.lineOffset = lineOffset; - this.lineLength = lineLength; - regionStart = new TextLocation (lineNumber, 1); - regionEnd = new TextLocation (lineNumber, lineLength); - - Setup (); - } - - void Setup () - { - defaultTextColor = "Plain Text"; - referenceTypeColor = "User Types"; - valueTypeColor = "User Types(Value types)"; - interfaceTypeColor = "User Types(Interfaces)"; - enumerationTypeColor = "User Types(Enums)"; - typeParameterTypeColor = "User Types(Type parameters)"; - delegateTypeColor = "User Types(Delegates)"; - - methodCallColor = "User Method Usage"; - methodDeclarationColor = "User Method Declaration"; - - eventDeclarationColor = "User Event Declaration"; - eventAccessColor = "User Event Usage"; - - fieldDeclarationColor ="User Field Declaration"; - fieldAccessColor = "User Field Usage"; - - propertyDeclarationColor = "User Property Declaration"; - propertyAccessColor = "User Property Usage"; - - variableDeclarationColor = "User Variable Declaration"; - variableAccessColor = "User Variable Usage"; - - parameterDeclarationColor = "User Parameter Declaration"; - parameterAccessColor = "User Parameter Usage"; + var resolver = parsedDocument.GetAst<SemanticModel> (); + if (resolver == null) + return; + src.Cancel (); + src = new CancellationTokenSource (); + var token = src.Token; - valueKeywordColor = "Keyword(Context)"; - externAliasKeywordColor = "Keyword(Namespace)"; - varKeywordTypeColor = "Keyword(Type)"; + Task.Run (async delegate { + try { + var root = await resolver.SyntaxTree.GetRootAsync (token); + var newTree = new HighlightingSegmentTree (); - parameterModifierColor = "Keyword(Parameter)"; - inactiveCodeColor = "Excluded Code"; - syntaxErrorColor = "Syntax Error"; + var visitor = new HighlightingVisitior (resolver, newTree.Add, token, TextSegment.FromBounds(0, root.FullSpan.Length)); + visitor.Visit (root); - stringFormatItemColor = "String Format Items"; - } - - protected override void Colorize(TextLocation start, TextLocation end, string color) - { - int startOffset; - if (start.Line == lineNumber) { - startOffset = lineOffset + start.Column - 1; - } else { - if (start.Line > lineNumber) - return; - startOffset = lineOffset; - } - int endOffset; - if (end.Line == lineNumber) { - endOffset = lineOffset +end.Column - 1; - } else { - if (end.Line < lineNumber) - return; - endOffset = lineOffset + lineLength; - } - tree.AddStyle (startOffset, endOffset, color); - } - - public override void VisitSimpleType (SimpleType simpleType) - { - var identifierToken = simpleType.IdentifierToken; - VisitChildrenUntil(simpleType, identifierToken); - var resolveResult = resolver.Resolve (simpleType, cancellationToken); - if (resolveResult.Type.Namespace == "System") { - switch (resolveResult.Type.Name) { - case "nfloat": - case "nint": - case "nuint": - Colorize(identifierToken, "Keyword(Type)"); - break; - default: - Colorize (identifierToken, resolveResult); - break; - } - } else { - Colorize (identifierToken, resolveResult); - } - VisitChildrenAfter(simpleType, identifierToken); - } - - public override void VisitIdentifierExpression (IdentifierExpression identifierExpression) - { - var identifier = identifierExpression.IdentifierToken; - VisitChildrenUntil(identifierExpression, identifier); - if (isInAccessorContainingValueParameter && identifierExpression.Identifier == "value") { - Colorize(identifier, valueKeywordColor); - } else { - var resolveResult = resolver.Resolve (identifierExpression, cancellationToken); - if (resolveResult.Type.Namespace == "System") { - switch (resolveResult.Type.Name) { - case "nfloat": - case "nint": - case "nuint": - Colorize(identifier, "Keyword(Type)"); - break; - default: - Colorize (identifier, resolveResult); - break; - } - } else { - Colorize (identifier, resolveResult); + if (!token.IsCancellationRequested) { + Gtk.Application.Invoke (delegate { + if (token.IsCancellationRequested) + return; + if (highlightTree != null) { + highlightTree.RemoveListener (); + } + highlightTree = newTree; + highlightTree.InstallListener (editor); + NotifySemanticHighlightingUpdate (); + }); } + } catch (OperationCanceledException) { + } catch (AggregateException ae) { + ae.Flatten ().Handle (x => x is OperationCanceledException); } - VisitChildrenAfter(identifierExpression, identifier); - } + }, token); } - class QuickTaskVisitor : DepthFirstAstVisitor + public override IEnumerable<ColoredSegment> GetColoredSegments (ISegment segment) { - internal List<QuickTask> QuickTasks = new List<QuickTask> (); - readonly CSharpAstResolver resolver; - readonly CancellationToken cancellationToken; - - public QuickTaskVisitor (CSharpAstResolver resolver, CancellationToken cancellationToken) - { - this.resolver = resolver; - this.cancellationToken = cancellationToken; - } - - protected override void VisitChildren (AstNode node) - { - if (cancellationToken.IsCancellationRequested) - return; - base.VisitChildren (node); - } - - public override void VisitIdentifierExpression (IdentifierExpression identifierExpression) - { - base.VisitIdentifierExpression (identifierExpression); - var result = resolver.Resolve (identifierExpression, cancellationToken); - if (result.IsError) { - QuickTasks.Add (new QuickTask (() => string.Format ("error CS0103: The name `{0}' does not exist in the current context", identifierExpression.Identifier), identifierExpression.StartLocation, Severity.Error)); - } - } - - public override void VisitMemberReferenceExpression (MemberReferenceExpression memberReferenceExpression) - { - base.VisitMemberReferenceExpression (memberReferenceExpression); - var result = resolver.Resolve (memberReferenceExpression, cancellationToken) as UnknownMemberResolveResult; - if (result != null && result.TargetType.Kind != TypeKind.Unknown) { - QuickTasks.Add (new QuickTask (string.Format ("error CS0117: `{0}' does not contain a definition for `{1}'", result.TargetType.FullName, memberReferenceExpression.MemberName), memberReferenceExpression.MemberNameToken.StartLocation, Severity.Error)); - } - } - - public override void VisitSimpleType (SimpleType simpleType) - { - base.VisitSimpleType (simpleType); - var result = resolver.Resolve (simpleType, cancellationToken); - if (result.IsError) { - QuickTasks.Add (new QuickTask (string.Format ("error CS0246: The type or namespace name `{0}' could not be found. Are you missing an assembly reference?", simpleType.Identifier), simpleType.StartLocation, Severity.Error)); - } - } + var result = new List<ColoredSegment> (); + if (highlightTree == null) + return result; + return highlightTree.GetSegmentsOverlapping (segment).Select (seg => seg.GetColoredSegment () ); + } + #endregion + } - public override void VisitMemberType (MemberType memberType) - { - base.VisitMemberType (memberType); - var result = resolver.Resolve (memberType, cancellationToken); - if (result.IsError) { - QuickTasks.Add (new QuickTask (string.Format ("error CS0246: The type or namespace name `{0}' could not be found. Are you missing an assembly reference?", memberType.MemberName), memberType.StartLocation, Severity.Error)); - } - } + class StyledTreeSegment : TreeSegment + { + string style; - public override void VisitComment (ICSharpCode.NRefactory.CSharp.Comment comment) - { - } - } - - static CSharpSyntaxMode () + public StyledTreeSegment (int offset, int length, string colorStyleKey) : base (offset, length) { - MonoDevelop.Debugger.DebuggingService.DisableConditionalCompilation += OnDisableConditionalCompilation; - if (IdeApp.Workspace != null) { - IdeApp.Workspace.ActiveConfigurationChanged += delegate { - foreach (var doc in IdeApp.Workbench.Documents) { - TextEditorData data = doc.Editor; - if (data == null) - continue; - // Force syntax mode reparse (required for #if directives) - var editor = doc.Editor; - if (editor != null) { - if (data.Document.SyntaxMode is SyntaxMode) { - ((SyntaxMode)data.Document.SyntaxMode).UpdateDocumentHighlighting (); - SyntaxModeService.WaitUpdate (data.Document); - } - editor.Parent.TextViewMargin.PurgeLayoutCache (); - doc.ReparseDocument (); - editor.Parent.QueueDraw (); - } - } - }; - } - CommentTag.SpecialCommentTagsChanged += (sender, e) => { - UpdateCommentRule (); - var actDoc = IdeApp.Workbench.ActiveDocument; - if (actDoc != null && actDoc.Editor != null) { - actDoc.UpdateParseDocument (); - actDoc.Editor.Parent.TextViewMargin.PurgeLayoutCache (); - actDoc.Editor.Parent.QueueDraw (); - } - }; + this.style = colorStyleKey; } - - static void OnDisableConditionalCompilation (object s, DocumentEventArgs e) + + public ColoredSegment GetColoredSegment () { - var mode = e.Document.Editor.Document.SyntaxMode as CSharpSyntaxMode; - if (mode == null) - return; - mode.DisableConditionalHighlighting = true; - e.Document.Editor.Document.CommitUpdateAll (); + return new ColoredSegment (Offset, Length, style); } - - static Dictionary<string, string> contextualHighlightKeywords; - static readonly string[] ContextualKeywords = new string[] { - "value" -/* "async", - "await", - , //* - "get", "set", "add", "remove", //* - "var", //* - "global", - "partial", //* - "where", //* - "select", - "group", - "by", - "into", - "from", - "ascending", - "descending", - "orderby", - "let", - "join", - "on", - "equals"*/ - }; + } - #region Syntax mode rule cache - static List<Rule> _rules; - static List<Mono.TextEditor.Highlighting.Keywords> _keywords; - static Span[] _spans; - static Match[] _matches; - static Marker[] _prevMarker; - static List<SemanticRule> _SemanticRules; - static Rule _commentRule; - static Dictionary<string, Mono.TextEditor.Highlighting.Keywords> _keywordTable; - static Dictionary<string, Mono.TextEditor.Highlighting.Keywords> _keywordTableIgnoreCase; - static Dictionary<string, List<string>> _properties; - #endregion + class HighlightingSegmentTree : SegmentTree<StyledTreeSegment> + { + } - static void UpdateCommentRule () + class HighlightingVisitior : SemanticHighlightingVisitor<string> + { + readonly Action<StyledTreeSegment> colorizeCallback; + + public HighlightingVisitior (SemanticModel resolver, Action<StyledTreeSegment> colorizeCallback, CancellationToken cancellationToken, ISegment textSpan) : base (resolver) { - if (_commentRule == null) - return; - var joinedTasks = string.Join ("", CommentTag.SpecialCommentTags.Select (t => t.Tag)); - _commentRule.SetDelimiter (new string ("&()<>{}[]~!%^*-+=|\\#/:;\"' ,\t.?".Where (c => joinedTasks.IndexOf (c) < 0).ToArray ())); - _commentRule.Keywords = new[] { - new Keywords { - Color = "Comment Tag", - Words = CommentTag.SpecialCommentTags.Select (t => t.Tag) - } - }; + if (resolver == null) + throw new ArgumentNullException (nameof (resolver)); + this.cancellationToken = cancellationToken; + this.colorizeCallback = colorizeCallback; + this.region = new TextSpan (textSpan.Offset, textSpan.Length); + Setup (); } - - public CSharpSyntaxMode (Document document) + + void Setup () { - this.guiDocument = document; - guiDocument.DocumentParsed += HandleDocumentParsed; - if (guiDocument.ParsedDocument != null) - HandleDocumentParsed (this, EventArgs.Empty); + + defaultTextColor = ColorScheme.PlainTextKey; + referenceTypeColor = ColorScheme.UserTypesKey; + valueTypeColor = ColorScheme.UserTypesValueTypesKey; + interfaceTypeColor = ColorScheme.UserTypesInterfacesKey; + enumerationTypeColor = ColorScheme.UserTypesEnumsKey; + typeParameterTypeColor = ColorScheme.UserTypesTypeParametersKey; + delegateTypeColor = ColorScheme.UserTypesDelegatesKey; - bool loadRules = _rules == null; + methodCallColor = ColorScheme.UserMethodUsageKey; + methodDeclarationColor = ColorScheme.UserMethodDeclarationKey; - if (loadRules) { - var provider = new ResourceStreamProvider (typeof(ResourceStreamProvider).Assembly, typeof(ResourceStreamProvider).Assembly.GetManifestResourceNames ().First (s => s.Contains ("CSharpSyntaxMode"))); - using (var reader = provider.Open ()) { - SyntaxMode baseMode = SyntaxMode.Read (reader); - _rules = new List<Rule> (baseMode.Rules.Where (r => r.Name != "Comment")); - _rules.Add (new Rule { - Name = "PreProcessorComment" - }); + eventDeclarationColor = ColorScheme.UserEventDeclarationKey; + eventAccessColor = ColorScheme.UserEventUsageKey; - _commentRule = new Rule { - Name = "Comment", - IgnoreCase = true - }; - UpdateCommentRule (); + fieldDeclarationColor = ColorScheme.UserFieldDeclarationKey; + fieldAccessColor = ColorScheme.UserFieldUsageKey; - _rules.Add (_commentRule); - _keywords = new List<Keywords> (baseMode.Keywords); - _spans = new List<Span> (baseMode.Spans.Where (span => span.Begin.Pattern != "#")).ToArray (); - _matches = baseMode.Matches; - _prevMarker = baseMode.PrevMarker; - _SemanticRules = new List<SemanticRule> (baseMode.SemanticRules); - _keywordTable = baseMode.keywordTable; - _keywordTableIgnoreCase = baseMode.keywordTableIgnoreCase; - _properties = baseMode.Properties; - } + propertyDeclarationColor = ColorScheme.UserPropertyDeclarationKey; + propertyAccessColor = ColorScheme.UserPropertyUsageKey; - contextualHighlightKeywords = new Dictionary<string, string> (); - foreach (var word in ContextualKeywords) { - if (_keywordTable.ContainsKey (word)) { - contextualHighlightKeywords[word] = _keywordTable[word].Color; - } else { - Console.WriteLine ("missing keyword:"+word); - } - } + variableDeclarationColor = ColorScheme.UserVariableDeclarationKey; + variableAccessColor = ColorScheme.UserVariableUsageKey; - foreach (var word in ContextualKeywords) { - _keywordTable.Remove (word); - } - } + parameterDeclarationColor = ColorScheme.UserParameterDeclarationKey; + parameterAccessColor = ColorScheme.UserParameterUsageKey; - rules = _rules; - keywords = _keywords; - spans = _spans; - matches = _matches; - prevMarker = _prevMarker; - SemanticRules = _SemanticRules; - keywordTable = _keywordTable; - keywordTableIgnoreCase = _keywordTableIgnoreCase; - properties = _properties; - - if (loadRules) { - AddSemanticRule ("Comment", new HighlightUrlSemanticRule ("Comment(Line)")); - AddSemanticRule ("XmlDocumentation", new HighlightUrlSemanticRule ("Comment(Doc)")); - AddSemanticRule ("String", new HighlightUrlSemanticRule ("String")); - } - } + valueKeywordColor = ColorScheme.KeywordContextKey; + externAliasKeywordColor = ColorScheme.KeywordNamespaceKey; + varKeywordTypeColor = ColorScheme.KeywordTypesKey; - #region IDisposable implementation + parameterModifierColor = ColorScheme.KeywordParameterKey; + inactiveCodeColor = ColorScheme.ExcludedCodeKey; - public void Dispose () - { - if (src != null) - src.Cancel (); - guiDocument.DocumentParsed -= HandleDocumentParsed; + stringFormatItemColor = ColorScheme.StringFormatItemsKey; + nameofKeywordColor = ColorScheme.KeywordOtherKey; + whenKeywordColor = ColorScheme.KeywordOtherKey; } - #endregion - - -// public override SpanParser CreateSpanParser (DocumentLine line, CloneableStack<Span> spanStack) -// { -// return new CSharpSpanParser (this, spanStack ?? line.StartSpan.Clone ()); -// } - - public override ChunkParser CreateChunkParser (SpanParser spanParser, ColorScheme style, DocumentLine line) + protected override void Colorize (TextSpan span, string color) { - return new CSharpChunkParser (this, spanParser, style, line); + colorizeCallback (new StyledTreeSegment (span.Start, span.Length, color)); } - protected class CSharpChunkParser : ChunkParser, IResolveVisitorNavigator + public override void VisitIdentifierName (Microsoft.CodeAnalysis.CSharp.Syntax.IdentifierNameSyntax node) { - - HashSet<string> tags = new HashSet<string> (); - - CSharpSyntaxMode csharpSyntaxMode; - int lineNumber; - public CSharpChunkParser (CSharpSyntaxMode csharpSyntaxMode, SpanParser spanParser, ColorScheme style, DocumentLine line) : base (csharpSyntaxMode, spanParser, style, line) - { - lineNumber = line.LineNumber; - this.csharpSyntaxMode = csharpSyntaxMode; - foreach (var tag in CommentTag.SpecialCommentTags) { - tags.Add (tag.Tag); - } - - } - - #region IResolveVisitorNavigator implementation - ResolveVisitorNavigationMode IResolveVisitorNavigator.Scan(AstNode node) - { - if (node is SimpleType || node is MemberType - || node is IdentifierExpression || node is MemberReferenceExpression - || node is InvocationExpression) { - return ResolveVisitorNavigationMode.Resolve; - } - return ResolveVisitorNavigationMode.Scan; - } - - void IResolveVisitorNavigator.Resolved(AstNode node, ResolveResult result) - { - } - - void IResolveVisitorNavigator.ProcessConversion(Expression expression, ResolveResult result, Conversion conversion, IType targetType) - { - } - #endregion - static int TokenLength (AstNode node) - { - Debug.Assert (node.StartLocation.Line == node.EndLocation.Line); - return node.EndLocation.Column - node.StartLocation.Column; - } - - protected override void AddRealChunk (Chunk chunk) - { - var document = csharpSyntaxMode.guiDocument; - var parsedDocument = document != null ? document.ParsedDocument : null; - if (parsedDocument != null && csharpSyntaxMode.SemanticHighlightingEnabled && csharpSyntaxMode.resolver != null) { - int endLoc = -1; - string semanticStyle = null; - if (spanParser.CurSpan != null && (spanParser.CurSpan.Rule == "Comment" || spanParser.CurSpan.Rule == "PreProcessorComment")) { - base.AddRealChunk (chunk); - return; - } - - try { - HighlightingVisitior visitor; - if (!csharpSyntaxMode.lineSegments.TryGetValue (line, out visitor)) { - var resolver = csharpSyntaxMode.resolver; - visitor = new HighlightingVisitior (resolver, default (CancellationToken), lineNumber, base.line.Offset, line.Length); - visitor.tree.InstallListener (doc); - resolver.RootNode.AcceptVisitor (visitor); - csharpSyntaxMode.lineSegments[line] = visitor; - } - string style; - if (visitor.tree.GetStyle (chunk, ref endLoc, out style)) { - semanticStyle = style; - } - } catch (Exception e) { - Console.WriteLine ("Error in semantic highlighting: " + e); - } - if (semanticStyle != null) { - if (endLoc < chunk.EndOffset) { - base.AddRealChunk (new Chunk (chunk.Offset, endLoc - chunk.Offset, semanticStyle)); - base.AddRealChunk (new Chunk (endLoc, chunk.EndOffset - endLoc, chunk.Style)); - return; - } - chunk.Style = semanticStyle; - } - } - - base.AddRealChunk (chunk); - } - - protected override string GetStyle (Chunk chunk) - { - if (spanParser.CurRule.Name == "Comment") { - if (tags.Contains (doc.GetTextAt (chunk))) - return "Comment Tag"; + switch (node.Identifier.Text) { + case "nfloat": + case "nint": + case "nuint": + var symbol = base.semanticModel.GetSymbolInfo (node).Symbol as INamedTypeSymbol; + if (symbol != null && symbol.ContainingNamespace.ToDisplayString () == "System") { + Colorize (node.Span, "Keyword(Type)"); + return; } - return base.GetStyle (chunk); + break; } + base.VisitIdentifierName (node); } - - - #region IQuickTaskProvider implementation - public event EventHandler TasksUpdated; - - protected virtual void OnTasksUpdated (EventArgs e) - { - var handler = TasksUpdated; - if (handler != null) - handler (this, e); - } - - List<QuickTask> quickTasks; - public IEnumerable<QuickTask> QuickTasks { - get { - return quickTasks; - } - } - #endregion } } - |