[svn] r6640: nemerle/trunk/ncc/parsing/Lexer.n
nemerle/trunk/ncc/parsing/LexerColorizer.n vs-plugin/trunk/...
IT
svnadmin at nemerle.org
Sun Sep 10 03:42:55 CEST 2006
Log:
MemberSelect call after space.
Author: IT
Date: Sun Sep 10 03:42:51 2006
New Revision: 6640
Modified:
nemerle/trunk/ncc/parsing/Lexer.n
nemerle/trunk/ncc/parsing/LexerColorizer.n
vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs
vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs
Modified: nemerle/trunk/ncc/parsing/Lexer.n
==============================================================================
--- nemerle/trunk/ncc/parsing/Lexer.n (original)
+++ nemerle/trunk/ncc/parsing/Lexer.n Sun Sep 10 03:42:51 2006
@@ -1695,6 +1695,8 @@
| Comment
+ | WhiteSpace
+
| EndOfFile
}
Modified: nemerle/trunk/ncc/parsing/LexerColorizer.n
==============================================================================
--- nemerle/trunk/ncc/parsing/LexerColorizer.n (original)
+++ nemerle/trunk/ncc/parsing/LexerColorizer.n Sun Sep 10 03:42:51 2006
@@ -361,16 +361,23 @@
def loop (c) {
| ' ' | '\t' | '\r' | '\n' =>
//System.Diagnostics.Debug.WriteLine("loop(whitespace) " + c.ToString());
- if (pos < reader.Length) {
- ++begin_pos;
- loop (read ())
- } else
- SyntaxType.EndOfFile
+ def wsloop(c)
+ {
+ when (pos < reader.Length) {
+ match (c) {
+ | ' ' | '\t' | '\r' | '\n' => wsloop(read())
+ | _ => --pos
+ }
+ }
+ }
+
+ wsloop(read());
+ SyntaxType.WhiteSpace
| '/' =>
//System.Diagnostics.Debug.WriteLine("loop(/) " + c.ToString());
match (comment_beginning (ref state)) {
- | '/' => loop (' ')
+ | '/' => loop (peek())
| _ =>
//++begin_pos; // loop (' ') increments in the FUCK case so we have too (but not here, dunno why...)
SyntaxType.Comment
@@ -383,7 +390,7 @@
| _ =>
//System.Diagnostics.Debug.WriteLine("loop(else) " + c.ToString());
- --pos; get_token ()
+ get_token ()
};
def tok =
if (pos >= reader.Length) {
@@ -398,15 +405,13 @@
else {
//System.Diagnostics.Debug.WriteLine("else {");
try {
- //FUCK: because it works as putting an extra char before then everything else has
- // to increment begin_pos, and later we have to substract 1
- loop (' ');
+ loop (peek());
}
catch {
| _ is LexerBase.Error => SyntaxType.EndOfFile
}
}
- SyntaxToken (begin_pos-1, pos - 1, tok);
+ SyntaxToken (begin_pos, pos-1, tok);
}
} // end class LexerColorizer
Modified: vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs (original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/NemerleLanguage.cs Sun Sep 10 03:42:51 2006
@@ -139,19 +139,19 @@
switch (request.Reason)
{
- case ParseReason.Autos: break;
case ParseReason.Check: return Check(request);
- case ParseReason.CodeSpan: break;
case ParseReason.MemberSelect:
case ParseReason.CompleteWord: return GetCompleteWord(request);
- case ParseReason.DisplayMemberList: break;
- case ParseReason.HighlightBraces: break;
- case ParseReason.MatchBraces: break;
- case ParseReason.MemberSelectAndHighlightBraces: break;
- case ParseReason.None: break;
- case ParseReason.MethodTip: break;
case ParseReason.Goto:
case ParseReason.QuickInfo: return GetScope(request);
+ case ParseReason.Autos:
+ case ParseReason.CodeSpan:
+ case ParseReason.DisplayMemberList:
+ case ParseReason.HighlightBraces:
+ case ParseReason.MatchBraces:
+ case ParseReason.None:
+ case ParseReason.MethodTip:
+ case ParseReason.MemberSelectAndHighlightBraces: break;
}
NemerleSource source;
Modified: vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs
==============================================================================
--- vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs (original)
+++ vs-plugin/trunk/Nemerle.VsIntegration/NemerleScanner.cs Sun Sep 10 03:42:51 2006
@@ -12,7 +12,9 @@
_lexer = _Root.lexer;
}
- LexerColorizer _lexer;
+ private LexerColorizer _lexer;
+ private string _source;
+ private LexerColorizer.SyntaxToken _prevToken;
enum TC
{
@@ -28,37 +30,46 @@
// Its calling depends on IVsColorizer.GetStateMaintenanceFlag, which defaults to true.
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state)
{
- LexerColorizer.SyntaxToken tok = _lexer.GetSyntaxToken(ref state);
+ LexerColorizer.SyntaxToken token = _lexer.GetSyntaxToken(ref state);
// TokenInfo is only read in *.LanguageService.dll
tokenInfo.Trigger = TokenTriggers.None;
+ tokenInfo.StartIndex = token.StartPos;
+ tokenInfo.EndIndex = token.EndPos;
- switch(tok.Token) {
- case SyntaxType.EndOfFile:
- return false;
+ //TODO: it has to handle # (pragma, region, etc)
+ switch(token.Token)
+ {
+ case SyntaxType.WhiteSpace:
+ tokenInfo.Color = TokenColor.Text;
+ tokenInfo.Type = TokenType. WhiteSpace;
+
+ if (_prevToken != null) switch (_prevToken.Token)
+ {
case SyntaxType.Keyword:
- tokenInfo.Color = TokenColor.Keyword;
- tokenInfo.Type = TokenType .Keyword;
+ if (_source == "using ")
+ tokenInfo.Trigger = TokenTriggers.MemberSelect;
+
break;
- case SyntaxType.Identifier:
- tokenInfo.Color = TokenColor.Identifier;
- tokenInfo.Type = TokenType. Identifier;
+ case SyntaxType.Operator:
+ switch (_source[_prevToken.StartPos])
+ {
+ case '|': tokenInfo.Trigger = TokenTriggers.MemberSelect; break;
+ }
+
+ break;
+ }
+
break;
- case SyntaxType.OperatorDot:
case SyntaxType.OperatorBrace:
- case SyntaxType.Operator:
tokenInfo.Color = (TokenColor)TC.Operator;
tokenInfo.Type = TokenType.Operator;
-
- switch (tok.Token)
- {
- case SyntaxType.OperatorBrace:
tokenInfo.Trigger = TokenTriggers.MatchBraces;
- switch (_lastString[tok.StartPos])
+ switch (_source[token.StartPos])
{
case '(': tokenInfo.Trigger |= TokenTriggers.ParameterStart; break;
case ')': tokenInfo.Trigger |= TokenTriggers.ParameterEnd; break;
@@ -67,10 +78,24 @@
break;
case SyntaxType.OperatorDot:
+ tokenInfo.Color = (TokenColor)TC.Operator;
+ tokenInfo.Type = TokenType.Operator;
tokenInfo.Trigger = TokenTriggers.MemberSelect;
break;
- }
+ case SyntaxType.Operator:
+ tokenInfo.Color = (TokenColor)TC.Operator;
+ tokenInfo.Type = TokenType.Operator;
+ break;
+
+ case SyntaxType.Keyword:
+ tokenInfo.Color = TokenColor.Keyword;
+ tokenInfo.Type = TokenType .Keyword;
+ break;
+
+ case SyntaxType.Identifier:
+ tokenInfo.Color = TokenColor.Identifier;
+ tokenInfo.Type = TokenType. Identifier;
break;
case SyntaxType.Comment:
@@ -98,26 +123,21 @@
tokenInfo.Color = TokenColor.Text;
tokenInfo.Type = TokenType. Text;
break;
- }
- tokenInfo.StartIndex = tok.StartPos;
- tokenInfo.EndIndex = tok.EndPos;
-
- // Nemerle lexer counts columns from 0, and the EndPos is inclusive. That is VS expects.
- //System.Diagnostics.Trace.WriteLine(string.Format("{0},{1} : {2} = '{3}'", tok.StartPos, tok.EndPos, tok.Token.ToString(), _laststring.Substring(tok.StartPos, tok.EndPos - tok.StartPos + 1)));
+ case SyntaxType.EndOfFile:
+ return false;
+ }
- //TODO: it has to handle # (pragma, region, etc)
+ _prevToken = token;
return true;
}
- string _lastString;
-
// The current implementation in *.LanguageService.dll always uses offset 0.
public void SetSource(string source, int offset)
{
- _lexer.SetString(source, offset);
- _lastString = source;
+ _prevToken = null;
+ _lexer.SetString(_source = source, offset);
}
}
}
More information about the svn
mailing list