[svn] r6566: nemerle/trunk/ncc: completion/CodeCompletionEngine.n
parsing/Lexer.n parsing/MainParser.n typ...
VladD2
svnadmin at nemerle.org
Tue Aug 22 23:17:48 CEST 2006
Log:
1. Add completion whiteout prefix.
2. Add completion for match expression (for the time being for variants only).
Author: VladD2
Date: Tue Aug 22 23:17:38 2006
New Revision: 6566
Modified:
nemerle/trunk/ncc/completion/CodeCompletionEngine.n
nemerle/trunk/ncc/parsing/Lexer.n
nemerle/trunk/ncc/parsing/MainParser.n
nemerle/trunk/ncc/typing/Typer-PatternTyper.n
nemerle/trunk/ncc/typing/Typer.n
Modified: nemerle/trunk/ncc/completion/CodeCompletionEngine.n
==============================================================================
--- nemerle/trunk/ncc/completion/CodeCompletionEngine.n (original)
+++ nemerle/trunk/ncc/completion/CodeCompletionEngine.n Tue Aug 22 23:17:38 2006
@@ -57,7 +57,8 @@
[NotNull] elems : SCG.List[Elem],
[NotNull] nss : list [NamespaceTree.Node],
obj : PExpr, // nullable
- [NotNull] name : Parsetree.Name) : void
+ [NotNull] name : Parsetree.Name,
+ noMacros : bool) : void
{
def prefix = name.Id;
def isAll = string.IsNullOrEmpty(prefix); // don't use prefix
@@ -74,6 +75,7 @@
{
| No => ()
| MacroCall(macr) =>
+ when (!noMacros)
elems.Add(Elem.Node (
if (macr.Keywords.IsEmpty) node.PartName else macr.Keywords.Head,
node));
Modified: nemerle/trunk/ncc/parsing/Lexer.n
==============================================================================
--- nemerle/trunk/ncc/parsing/Lexer.n (original)
+++ nemerle/trunk/ncc/parsing/Lexer.n Tue Aug 22 23:17:38 2006
@@ -951,7 +951,9 @@
| '@' =>
def next = read ();
- if (IsOperatorChar (next))
+ if (next == '#') // Completion token.
+ Token.IdentifierToComplete ("")
+ else if (IsOperatorChar (next))
match (get_op (next)) {
| Token.Operator (s) => Token.Identifier (s)
| _ => Util.ice ()
@@ -1667,7 +1669,9 @@
CompletionMarkAt = -1;
pendingToken = Token.IdentifierToComplete ("");
tok
- | _ => tok
+ | _ =>
+ CompletionMarkAt = -1;
+ Token.IdentifierToComplete (tok.ToString())
}
else
tok;
Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n (original)
+++ nemerle/trunk/ncc/parsing/MainParser.n Tue Aug 22 23:17:38 2006
@@ -1755,12 +1755,24 @@
}
parse_match_case () : MatchCase {
- def loop2 (acc) {
+ def loop2 (acc)
+ {
+ def ReportError (x, res)
+ {
+ Error (x, "'=>' or '|' expected (or incorrect pattern format)");
+ List.Rev (res :: acc)
+ }
def res = parse_expr (TokenStoppers.Pipe | TokenStoppers.Arrow);
match (get_token ()) {
| Token.Operator ("=>") => List.Rev (res :: acc)
| Token.Operator ("|") => loop2 (res :: acc)
- | x => Error (x, "found junk after pattern"); List.Rev (res :: acc)
+ | Token.EndOfGroup as x =>
+ match (res) {
+ | PExpr.ToComplete (_)
+ | PExpr.Member (_, Splicable.HalfId (_)) => List.Rev (res :: acc)
+ | _ => ReportError (x, res)
+ }
+ | x => ReportError (x, res)
}
};
def case_group = (stream :> Token.LooseGroup);
@@ -2116,7 +2128,7 @@
| PExpr.Member (obj, Splicable.HalfId (name)) =>
def elems = SCG.List ();
def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, obj, name);
+ Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
throw CompletionResult (elems, name.Id);
| _ => ()
Modified: nemerle/trunk/ncc/typing/Typer-PatternTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-PatternTyper.n (original)
+++ nemerle/trunk/ncc/typing/Typer-PatternTyper.n Tue Aug 22 23:17:38 2006
@@ -33,6 +33,7 @@
using Nemerle.Compiler.Typedtree;
using Nemerle.Compiler.SolverMacros;
+using SCG = System.Collections.Generic;
using PT = Nemerle.Compiler.Parsetree;
namespace Nemerle.Compiler
@@ -557,6 +558,37 @@
DoTypePattern (matched_value_type : TyVar, pattern : PT.PExpr) : Pattern
{
match (pattern) {
+ | PT.PExpr.ToComplete (name) with obj = null
+ | PT.PExpr.Member (obj, Parsetree.Splicable.HalfId (name)) =>
+ def elems = SCG.List ();
+ match (matched_value_type.Hint)
+ {
+ | Some(ty) =>
+ def prefix = name.Id;
+ def option = System.StringComparison.InvariantCultureIgnoreCase;
+ match (ty)
+ {
+ | MType.Class (ti, _args) =>
+ match (ti.GetTydecl ())
+ {
+ | TypeDeclaration.Variant (members) =>
+ foreach (m when m.Name.StartsWith (prefix, option) in members)
+ elems.Add (Elem.Node (m.Name, m.NamespaceNode));
+
+ //| TypeDeclaration.VariantOption =>
+ | _ => System.Console.WriteLine(ty);
+ }
+ | _ => System.Console.WriteLine(ty);
+ }
+
+ | None =>
+ def nss = Manager.CoreEnv.NameTree.NamespaceTree
+ :: name.GetEnv(Manager.CoreEnv).OpenNamespaces;
+ Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
+ }
+
+ throw CompletionResult (elems, name.Id);
+
| PT.PExpr.ListLiteral (l) =>
TypePattern (matched_value_type, Macros.Lift (l))
@@ -756,7 +788,6 @@
".. arguments list may appear only within <[ ... ]> quotation");
Pattern.Error ()
-
| _ =>
ReportError (messenger, "invalid pattern");
Pattern.Error ()
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Tue Aug 22 23:17:38 2006
@@ -1418,7 +1418,7 @@
if (member_overloads.IsEmpty)
{
def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, obj, name);
+ Completion.AddTypesAndNamespaces (elems, nss, obj, name, false);
}
else
elems.Add(Elem.Overloads (member_overloads));
@@ -1443,7 +1443,7 @@
// add namespaces and types
def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
- Completion.AddTypesAndNamespaces (elems, nss, null, name);
+ Completion.AddTypesAndNamespaces (elems, nss, null, name, false);
throw CompletionResult (elems, prefix)
More information about the svn
mailing list