2
// HighlightPropertiesSemanticRule.cs
5
// Mike Krüger <mkrueger@novell.com>
7
// Copyright (C) 2008 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
using System.Collections.Generic;
32
using Mono.TextEditor;
33
using Mono.TextEditor.Highlighting;
34
using MonoDevelop.Ide.Gui;
35
using MonoDevelop.Projects;
36
using MonoDevelop.Projects.Dom;
37
using MonoDevelop.Projects.Dom.Parser;
38
using MonoDevelop.Projects.Gui.Completion;
40
namespace MonoDevelop.SourceEditor
42
class HighlightPropertiesRule : SemanticRule
44
// ProjectDom GetParserContext (Mono.TextEditor.Document document)
46
// Project project = IdeApp.ProjectOperations.CurrentSelectedProject;
47
// if (project != null)
48
// return ProjectDomService.GetProjectDom (project);
49
// return ProjectDom.Empty;
53
IMember GetLanguageItem (Mono.TextEditor.Document document, int offset)
57
ProjectDom ctx = GetParserContext (document);
61
IExpressionFinder expressionFinder = null;
62
if (document.FileName != null)
63
expressionFinder = ProjectDomService.GetExpressionFinder (document.FileName);
64
if (expressionFinder == null)
66
string txt = document.Text;
67
expression = expressionFinder.FindFullExpression (txt, offset).Expression;
68
if (expression == null)
70
int lineNumber = document.OffsetToLineNumber (offset);
71
LineSegment line = document.GetLine (lineNumber);
73
return ctx.ResolveIdentifier (expression, lineNumber + 1, line.Offset + 1, document.FileName, null);*/
76
public override void Analyze (Mono.TextEditor.Document doc, LineSegment line, List<Chunk> chunks, int startOffset, int endOffset)
78
for (int j = 0; j < chunks.Count; j++) {
79
Chunk chunk = chunks[j];
80
if (chunk.Style.Color.Pixel != 0)
82
for (int i = chunk.Offset; i < chunk.EndOffset; i++) {
83
char charBefore = i == chunk.Offset ? 'E' : doc.GetCharAt (i - 1);
84
if (Char.IsLetter (doc.GetCharAt (i)) && !Char.IsLetterOrDigit (charBefore)) {
89
IMember item = GetLanguageItem (doc, i);
90
if (item is IProperty) {
91
int propertyLength = item.Name.Length;
94
Chunk propertyChunk = new Chunk (i, propertyLength, new ChunkStyle ());
95
propertyChunk.Style.Italic = true;
96
propertyChunk.Style.Color = chunk.Style.Color;
97
chunks.Insert (j + 1, propertyChunk);
100
// Chunk after property
101
if (chunk.EndOffset - propertyChunk.EndOffset > 0) {
102
Chunk newChunk = new Chunk (propertyChunk.EndOffset, chunk.EndOffset - propertyChunk.EndOffset, chunk.Style);
103
chunks.Insert (j + 1, newChunk);
106
// Shorten current chunk
107
chunk.Length = propertyChunk.Offset - chunk.Offset;