[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