Changeset 1567fcce2711ee19e98902f8ef734f1a7dd9731f

Show
Ignore:
Timestamp:
06/28/09 23:36:50 (14 months ago)
Author:
mb0 <mb0@…>
Children:
b32f7a496c511e07158f0d0752addedc2b378328
Parents:
364575fc79ca0a2d7d0efbd5c165c1d2dfc36a3b
git-author:
mb0 <mb0@…> (06/11/09 05:29:42)
git-committer:
mb0 <mb0@…> (06/28/09 23:36:50)
Message:

content proposer uses new parse stream when using backup ast.
if there is an error we can still collect accurate token information.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • org.axdt.as3/src/org/axdt/as3/imp/services/AS3ContentProposer.java

    r49cbb50 r1567fcc  
    2828import org.eclipse.imp.editor.SourceProposal; 
    2929import org.eclipse.imp.parser.IParseController; 
     30import org.eclipse.imp.parser.IParser; 
    3031import org.eclipse.imp.services.IContentProposer; 
    31 import org.eclipse.jface.text.BadLocationException; 
    3232import org.eclipse.jface.text.ITextViewer; 
    3333import org.eclipse.jface.text.contentassist.ICompletionProposal; 
     
    3838         
    3939        private boolean offsetWithinToken; 
    40         private boolean usingBackup; 
    4140        private int offset; 
    4241        private AS3ParseController control; 
     
    5655        private ITextViewer viewer; 
    5756 
    58         private boolean dontTrustTokens; 
     57        private boolean usingBackup; 
    5958 
    6059        private int originalOffset; 
    6160 
    62         private boolean offsetBeforeToken; 
    6361 
    6462        private int offsetDiff; 
     
    6765         
    6866        private void clear() { 
    69                 offsetWithinToken = offsetAfterToken = offsetBeforeToken = nextIsSemi = false; 
    70                 usingBackup = dontTrustTokens = false; 
     67                offsetWithinToken = offsetAfterToken = nextIsSemi = false; 
    7168                prefix = null;  
    7269                ancestors = null; 
    7370                token = previous = next = null; 
    74                 ast = node = null; 
    75                 originalOffset = offset; 
     71                node = null; 
    7672        } 
    7773 
    7874        public AS3ContentProposer() { 
    79         } 
    80         private boolean tokenIsValid(IToken t) { 
    81                 String text = t.toString(); 
    82                 try { 
    83                         String string = viewer.getDocument().get(t.getStartOffset(), text.length()); 
    84                         return text.equals(string); 
    85                 } catch (BadLocationException e) { 
    86                         AS3Plugin.getDefault().debug("error validating token", e); 
    87                 } 
    88                 return false; 
    89         } 
    90         private String tokenIsValid(IToken t, int diff, int lendiff) { 
    91                 try { 
    92                         String text = t.toString(); 
    93                         int offset = t.getStartOffset()+diff; 
    94                         int length = text.length()+lendiff; 
    95                         String string = viewer.getDocument().get(offset, length); 
    96                         if (lendiff>0) { 
    97                                 if (string.startsWith(text)) { 
    98                                         return string; 
    99                                 } 
    100                         } else if (diff != 0) { 
    101                                 if (text.equals(string)) 
    102                                         return string; 
    103                         } 
    104                 } catch (Exception e) { 
    105                         AS3Plugin.getDefault().debug("error validating token", e); 
    106                 } 
    107                 return null; 
    10875        } 
    10976        protected boolean collectInfo(IParseController controller, int offset, ITextViewer viewer) { 
     
    11279                this.offset = offset; 
    11380                offsetDiff = offset - originalOffset; 
     81                usingBackup = false; 
     82                ast = null; 
    11483                ASTNode newast = getAst(); 
    11584                if (newast != null && newast == ast) { 
    11685                        AS3Plugin.getDefault().debug("using old ast nothing changed"); 
    11786                        return true; 
     87                } 
     88                IParser parser = control.getParser(); 
     89                IPrsStream stream = parser.getIPrsStream(); 
     90                if (stream == null)  { 
     91                        AS3Plugin.getDefault().debug("no error lexing."); 
     92                        return false; 
    11893                } 
    11994                if (newast == null) { 
     
    125100                        } 
    126101                        newast = (ASTNode) backupAst; 
    127                         String validPrefix = tokenIsValid(token,0,offsetDiff); 
    128                         if (validPrefix != null) { 
    129                                 if (offsetDiff>0) { 
    130                                         boolean previousIsValid = tokenIsValid(previous); 
    131                                         boolean nextIsValid = null != tokenIsValid(next,offsetDiff,0); 
    132                                         if (previousIsValid && nextIsValid) { 
    133                                                 prefix = validPrefix; 
    134                                                 dontTrustTokens = true; 
    135                                                 this.offset = offset;   
    136                                                 AS3Plugin.getDefault().debug("recovery ok."); 
    137                                                 return true; 
    138                                         } 
    139                                 } 
    140                         } 
    141                         return false; 
     102                        usingBackup = true; 
     103                } else { 
     104                        originalOffset = offset; 
    142105                } 
    143106                clear(); 
    144107                try { 
    145108                        ast = newast; 
    146                         IPrsStream stream = control.getParser().getIPrsStream(); 
    147                         int index = stream.getTokenIndexAtCharacter(offset); 
     109                        int myOffset = offset; 
     110                        int index = stream.getTokenIndexAtCharacter(myOffset); 
    148111                        token = getToken(stream, index < 0 ? -index + 1: index); 
    149112                        previous = getToken(stream, token.getTokenIndex()-1); 
    150                         if (previous.getEndOffset() == offset - 1) { 
    151                                 offsetAfterToken = true; 
     113                        offsetAfterToken = previous.getEndOffset() == myOffset - 1; 
     114                        if (offsetAfterToken || token.getKind() == Sym.TK_SEMI  
     115                                || (myOffset < token.getStartOffset()&& stream.getILexStream().getLineNumberOfCharAt(myOffset) < token.getLine())) { 
    152116                                next = token; 
    153117                                token = previous; 
    154118                                previous = stream.getIToken(token.getTokenIndex()-1); 
    155                         } else { 
     119                        } 
     120                        if (next == null){ 
    156121                                next = stream.getIToken(stream.getNext(token.getTokenIndex())); 
    157122                        } 
    158123                        nextIsSemi = next.getKind() == Sym.TK_SEMI; 
    159                         offsetWithinToken = Sym.isWithinToken(offset, token); 
    160                         offsetBeforeToken = offset < token.getStartOffset(); 
     124                        offsetWithinToken = Sym.isWithinToken(myOffset, token); 
    161125                        if ((offsetAfterToken||offsetWithinToken) && Sym.isKeyword(token))  
    162126                                return false; 
    163                         this.prefix = offsetWithinToken ? Sym.getPrefix(offset, token)  
     127                        this.prefix = offsetWithinToken ? Sym.getPrefix(myOffset, token)  
    164128                                        : ( offsetAfterToken ? token.toString() : ""); 
    165129                        node = getNode(token); 
     
    229193                                                // in package header 
    230194                                                IName nameNode = packdef.getName(); 
    231                                                 prefix = fetchName((IAst) nameNode); 
     195                                                if (!usingBackup) 
     196                                                        prefix = fetchName((IAst) nameNode); 
    232197                                                IResource project = control.getProject().getResource(); 
    233198                                                String expectedName = AS3Util.getExpectedPackageName(project,project.getFullPath().append(control.getPath())); 
     
    236201                                        } else { 
    237202                                                proposals.addUnitScopeProposals(node); 
    238                                                 if (prefix.startsWith("import")) { 
     203                                                boolean isImport = token.getKind() == Sym.TK_import; 
     204                                                if (isImport || prefix.startsWith("import")) { 
    239205                                                        for (String packname:Index0r.getInstance().getPackageNames()) { 
    240                                                                 proposals.addSourceProposal("import "+packname+".*", prefix, ImportDirective.class, !nextIsSemi); 
     206                                                                String proposed = (isImport ? "":"import ")+packname+".*"; 
     207                                                                proposals.addSourceProposal(proposed, prefix, ImportDirective.class, !nextIsSemi); 
    241208                                                        } 
    242209                                                } 
     
    244211                                } else if (ancestor instanceof ImportDirective) { 
    245212                                        IName nameNode = ((ImportDirective)ancestor).getName(); 
    246                                         prefix = fetchName((IAst) nameNode); 
     213                                        if (!usingBackup) 
     214                                                prefix = fetchName((IAst) nameNode); 
    247215                                        int dotIndex = prefix.lastIndexOf('.'); 
    248216                                        Collection<String> packageNames = Index0r.getInstance().getPackageNames();