]> gitweb.factorcode.org Git - factor.git/commitdiff
Plugin improvements
authorSlava Pestov <slava@factorcode.org>
Mon, 20 Dec 2004 21:06:55 +0000 (21:06 +0000)
committerSlava Pestov <slava@factorcode.org>
Mon, 20 Dec 2004 21:06:55 +0000 (21:06 +0000)
factor/FactorReader.java
factor/jedit/FactorPlugin.java
factor/jedit/FactorSideKickParser.java

index d2cc137f2637c6a556d379ad9458c9c4b225a58a..47a24f954bc43817f7e2a1e812065f9a07392db1 100644 (file)
@@ -40,6 +40,7 @@ public class FactorReader
 {
        private VocabularyLookup lookup;
        private FactorScanner scanner;
+       private ParseState topState;
        private Cons states;
 
        /**
@@ -52,6 +53,8 @@ public class FactorReader
        private String in;
        private int base = 10;
 
+       private Cons definedWords;
+
        //{{{ getUnreadableString() method
        public static String getUnreadableString(String str)
        {
@@ -162,6 +165,7 @@ public class FactorReader
                this.lookup = lookup;
                this.scanner = scanner;
                pushState(toplevel,null);
+               topState = (ParseState)states.car;
                this.alwaysDocComments = alwaysDocComments;
                this.in = DefaultVocabularyLookup.DEFAULT_IN;
                this.use = DefaultVocabularyLookup.DEFAULT_USE;
@@ -217,7 +221,8 @@ public class FactorReader
                        if(next())
                        {
                                // eof.
-                               return popState(toplevel,toplevel).first;
+                               popState(toplevel,toplevel);
+                               return topState.first;
                        }
                }
        } //}}}
@@ -233,17 +238,29 @@ public class FactorReader
        public FactorWord intern(String name, boolean define)
                throws Exception
        {
+               FactorWord word;
+
                if(define)
-                       return lookup.define(getIn(),name);
+               {
+                       word = lookup.define(getIn(),name);
+                       definedWords = new Cons(word,definedWords);
+               }
                else
                {
-                       FactorWord word = searchVocabulary(getUse(),name);
+                       word = searchVocabulary(getUse(),name);
                        if(word == null)
                                error("Undefined: " + name);
-                       return word;
                }
+               
+               return word;
        } //}}}
 
+       //{{{ getDefinedWords() method
+       public Cons getDefinedWords()
+       {
+               return definedWords;
+       } //}}}
+       
        //{{{ nextWord() method
        /**
         * Read a word from the scanner and intern it. Returns null on EOF.
index 7b5b6ddb8bc1ddbe22e3c4770619f8b92816c58d..bc9bb9c6d21a6fe634204a6ca84662496952d00c 100644 (file)
@@ -77,7 +77,7 @@ public class FactorPlugin extends EditPlugin
                Buffer buffer = jEdit.getFirstBuffer();
                while(buffer != null)
                {
-                       buffer.setProperty(FactorSideKickParser.PARSED_PROPERTY,null);
+                       buffer.setProperty(FactorSideKickParser.WORDS_PROPERTY,null);
                        buffer = buffer.getNext();
                }
        } //}}}
index cda9819c61fda5bf28d7b55b92456c098ba16c2a..997e993e4aaa53bb22af5d6c1f9f5b0af7791282 100644 (file)
@@ -43,7 +43,7 @@ public class FactorSideKickParser extends SideKickParser
        /**
         * We store the file's parse tree in this property.
         */
-       public static String PARSED_PROPERTY = "factor-parsed";
+       public static String WORDS_PROPERTY = "factor-parsed";
 
        private Map previewMap;
 
@@ -98,8 +98,9 @@ public class FactorSideKickParser extends SideKickParser
        public SideKickParsedData parse(Buffer buffer,
                DefaultErrorSource errorSource)
        {
-               Cons parsed = (Cons)buffer.getProperty(PARSED_PROPERTY);
-               removeWordDefinitions(parsed);
+               Object words = buffer.getProperty(WORDS_PROPERTY);
+               if(words instanceof Cons)
+                       forgetWords((Cons)words);
 
                FactorParsedData d = new FactorParsedData(
                        this,buffer.getPath());
@@ -117,6 +118,8 @@ public class FactorSideKickParser extends SideKickParser
                        buffer.readUnlock();
                }
 
+               FactorReader r = null;
+
                try
                {
                        /* of course wrapping a string reader in a buffered
@@ -125,15 +128,12 @@ public class FactorSideKickParser extends SideKickParser
                                buffer.getPath(),
                                new BufferedReader(new StringReader(text)),
                                errorSource);
-                       FactorReader r = new FactorReader(scanner,
-                               false,FactorPlugin.getExternalInstance());
+                       r = new FactorReader(scanner,false,FactorPlugin.getExternalInstance());
 
-                       parsed = r.parse();
+                       Cons parsed = r.parse();
 
                        d.in = r.getIn();
                        d.use = r.getUse();
-       
-                       buffer.setProperty(PARSED_PROPERTY,parsed);
 
                        addWordDefNodes(d,parsed,buffer);
                }
@@ -151,21 +151,20 @@ public class FactorSideKickParser extends SideKickParser
                        Log.log(Log.DEBUG,this,e);
                }
 
+               if(r != null)
+                       buffer.setProperty(WORDS_PROPERTY,r.getDefinedWords());
+
                return d;
        } //}}}
 
-       //{{{ removeWordDefinitions() method
-       private void removeWordDefinitions(Cons parsed)
+       //{{{ forgetWords() method
+       private void forgetWords(Cons words)
        {
-               while(parsed != null)
+               while(words != null)
                {
-                       Object obj = parsed.car;
-                       if(obj instanceof FactorWordDefinition)
-                       {
-                               FactorPlugin.getExternalInstance().forget(
-                                       ((FactorWordDefinition)obj).word);
-                       }
-                       parsed = parsed.next();
+                       Object obj = words.car;
+                       FactorPlugin.getExternalInstance().forget((FactorWord)obj);
+                       words = words.next();
                }
        } //}}}