Changeset 69d1ca8cf4ab8b63f93d4467f3d504c0ffdfabb7

Show
Ignore:
Timestamp:
06/28/09 23:36:50 (8 months ago)
Author:
mb0 <mb0@…>
git-author:
mb0 <mb0@mb0.org> / 2009-06-09T22:25:17Z+0200
Parents:
2d81bf0e2ed8217c6cb2a26fcb22d09b8441f7a3
Children:
80657c560c55a46e8bdb3bcc2aef994a475d2511
git-committer:
mb0 <mb0@mb0.org> / 2009-06-28T23:36:50Z+0200
Message:

grammar

virtual semicolon insertion fix for rparen ')' reduced
semi insertion will be skipped if there is a control statement
like 'if'..'while' in the same line

as3

as3 parser resolves in 2 steps now.
builder caches and reuses parsecontroller
added content proposals for imports (only asdoc for now)

moved some helper methods to util class

hover helper presents real asdoc for resolved imports.
added hyper link detector implemetation that can handle string ids

and will find and open the asdoc resources

as3 node locator was not used updated implementation
as3 message handler got a dirty hack to correct the annotation region.
reference resolver trimmed down for now.
label provider offers images for ast classes now.

common

moved uri input to its own file in common.
added uri hyper link.

Files:
6 added
15 modified

Legend:

Unmodified
Added
Removed
  • org.axdt.as3.debug/src/org/axdt/as3/debug/launcher/AS3LauncherDelegate.java

    rfc56e42 r69d1ca8  
    99import org.axdt.as3.debug.preferences.AS3DebugPreferences; 
    1010import org.axdt.common.preferences.CompilerPreferences; 
     11import org.axdt.util.URIInput; 
    1112import org.eclipse.core.resources.IContainer; 
    1213import org.eclipse.core.resources.IFile; 
     
    3132import org.eclipse.debug.core.model.IStreamsProxy; 
    3233import org.eclipse.debug.core.model.LaunchConfigurationDelegate; 
    33 import org.eclipse.jface.resource.ImageDescriptor; 
    3434import org.eclipse.swt.program.Program; 
    3535import org.eclipse.swt.widgets.Display; 
    36 import org.eclipse.ui.IPersistableElement; 
    37 import org.eclipse.ui.IURIEditorInput; 
    3836import org.eclipse.ui.IWorkbench; 
    3937import org.eclipse.ui.IWorkbenchPage; 
     
    182180        } 
    183181} 
    184  
    185 class URIInput implements IURIEditorInput { 
    186  
    187         private final URI uri; 
    188  
    189         public URIInput(URI uri) { 
    190                 this.uri = uri; 
    191         } 
    192  
    193         public URI getURI() { 
    194                 return uri; 
    195         } 
    196  
    197         public boolean exists() { 
    198                 return false; 
    199         } 
    200  
    201         public ImageDescriptor getImageDescriptor() { 
    202                 return null; 
    203         } 
    204  
    205         public String getName() { 
    206                 return uri.toString(); 
    207         } 
    208  
    209         public IPersistableElement getPersistable() { 
    210                 return null; 
    211         } 
    212  
    213         public String getToolTipText() { 
    214                 return ""; 
    215         } 
    216  
    217         @SuppressWarnings("unchecked") 
    218         public Object getAdapter(Class adapter) { 
    219                 return null; 
    220         } 
    221  
    222         @Override 
    223         public boolean equals(Object obj) { 
    224                 if (!(obj instanceof URIInput)) return false; 
    225                 URIInput other = (URIInput) obj; 
    226                 return uri.equals(other.uri); 
    227         } 
    228 } 
  • org.axdt.as3/plugin.xml

    rc598ac6 r69d1ca8  
    7474            language="AS3"> 
    7575      </hoverHelper> 
     76   </extension> 
     77   <extension 
     78         point="org.eclipse.imp.runtime.hyperLink"> 
     79      <hyperlinkDetector 
     80            class="org.axdt.as3.imp.hyperLink.AS3HyperLinkDetector" 
     81            language="AS3"> 
     82      </hyperlinkDetector> 
    7683   </extension> 
    7784   <extension 
  • org.axdt.as3/src/org/axdt/as3/imp/builders/AS3Builder.java

    r374c0f9 r69d1ca8  
    11package org.axdt.as3.imp.builders; 
    22 
     3import java.util.HashMap; 
     4 
     5import org.axdt.as3.AS3Plugin; 
     6import org.axdt.as3.imp.parser.AS3ParseController; 
     7import org.axdt.as3.preferences.AS3Preferences; 
     8import org.axdt.as3.util.AS3Util; 
     9import org.eclipse.core.resources.IContainer; 
    310import org.eclipse.core.resources.IFile; 
    411import org.eclipse.core.resources.IResource; 
     
    613import org.eclipse.core.runtime.IProgressMonitor; 
    714import org.eclipse.core.runtime.content.IContentDescription; 
    8  
     15import org.eclipse.imp.builder.BuilderBase; 
    916import org.eclipse.imp.builder.BuilderUtils; 
    1017import org.eclipse.imp.builder.MarkerCreator; 
    11 import org.eclipse.imp.builder.BuilderBase; 
    1218import org.eclipse.imp.language.Language; 
    1319import org.eclipse.imp.language.LanguageRegistry; 
     
    1521import org.eclipse.imp.model.ModelFactory; 
    1622import org.eclipse.imp.model.ModelFactory.ModelException; 
    17 import org.eclipse.imp.parser.IParseController; 
    1823import org.eclipse.imp.runtime.PluginBase; 
    1924import org.eclipse.jface.preference.IPreferenceStore; 
    20  
    21 import org.axdt.as3.AS3Plugin; 
    22 import org.axdt.as3.imp.parser.AS3ParseController; 
    23 import org.axdt.as3.preferences.AS3Preferences; 
    2425 
    2526/** 
     
    3334        public static final String PROBLEM_MARKER_ID = AS3Plugin.PLUGIN_ID + ".imp.builder.problem"; 
    3435        public static final Language LANGUAGE = LanguageRegistry.findLanguage(AS3Plugin.LANGUAGE); 
     36        private HashMap<IPath, AS3ParseController> files; 
    3537 
    3638        public AS3Builder() { 
    3739                super(); 
     40                files = new HashMap<IPath, AS3ParseController>(); 
    3841        } 
    3942 
     
    6467                IPath path = file.getRawLocation(); 
    6568                if (path == null) return false; 
     69                IContainer sourceFolder = AS3Util.getSourceFolder(file); 
    6670 
    67                 String pathString = path.toString(); 
    68                 IPreferenceStore store = AS3Preferences.getInstance().getProjectStore(file); 
    69                 String deployPart = store.getString(AS3Preferences.DEPLOY_PATH); 
    70                 if (pathString.indexOf(deployPart) != -1) return false; 
     71                if (sourceFolder == null) return false; 
    7172 
    7273                return LANGUAGE.hasExtension(path.getFileExtension()); 
     
    111112        protected void compile(final IFile file, IProgressMonitor monitor) { 
    112113                try { 
    113                         IParseController parse = new AS3ParseController(); 
     114                         
     115                        AS3ParseController parse = getParseController(file); 
    114116 
    115117                        MarkerCreator marker = new MarkerCreator(file, parse, PROBLEM_MARKER_ID); 
     
    132134                                } 
    133135                        } 
    134                         parse.parse(contents, monitor); 
     136                        parse.parse(contents, true, monitor); 
    135137 
    136138                } catch (ModelException e) { 
     
    139141                } 
    140142        } 
     143 
     144        private AS3ParseController getParseController(IFile file) { 
     145                IPath path = file.getFullPath(); 
     146                AS3ParseController controller = files.get(path); 
     147                if (controller == null) { 
     148                        controller = new AS3ParseController(); 
     149                        files.put(path, controller); 
     150                } else { 
     151                        AS3Plugin.getDefault().debug("reusing builder parse controller for "+ path); 
     152                } 
     153                return controller; 
     154        } 
    141155} 
  • org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3ContentProposer.java

    r87f02d1 r69d1ca8  
    22 
    33import java.util.ArrayList; 
     4import java.util.Collection; 
    45import java.util.Collections; 
    56import java.util.Comparator; 
     
    1718import org.axdt.as3.imp.parser.Ast.IAnnotatableDirective_full; 
    1819import org.axdt.as3.imp.parser.Ast.IName; 
     20import org.axdt.as3.imp.parser.Ast.ImportDirective; 
    1921import org.axdt.as3.imp.parser.Ast.PackageDefinition; 
    2022import org.axdt.as3.preferences.AS3Preferences; 
    2123import org.axdt.as3.templates.AS3TemplateCompletionProcessor; 
     24import org.axdt.as3.util.AS3Util; 
     25import org.axdt.axdoc.model.AXEntry; 
     26import org.axdt.axdoc.model.AXIndex; 
     27import org.axdt.axdoc.util.Index0r; 
    2228import org.eclipse.core.resources.IContainer; 
     29import org.eclipse.core.resources.IResource; 
    2330import org.eclipse.core.runtime.IPath; 
    2431import org.eclipse.imp.editor.SourceProposal; 
     
    5966 
    6067        private int offsetDiff; 
     68 
     69        private boolean nextIsSemi; 
    6170         
    6271        private void clear() { 
    63                 offsetWithinToken = offsetAfterToken = offsetBeforeToken = false; 
     72                offsetWithinToken = offsetAfterToken = offsetBeforeToken = nextIsSemi = false; 
    6473                usingBackup = dontTrustTokens = false; 
    6574                prefix = null;  
     
    7180 
    7281        public AS3ContentProposer() { 
    73                  
    7482        } 
    7583        private boolean tokenIsValid(IToken t) { 
     
    8492        } 
    8593        private String tokenIsValid(IToken t, int diff, int lendiff) { 
    86                 String text = t.toString(); 
    8794                try { 
     95                        String text = t.toString(); 
    8896                        int offset = t.getStartOffset()+diff; 
    8997                        int length = text.length()+lendiff; 
     
    97105                                        return string; 
    98106                        } 
    99                 } catch (BadLocationException e) { 
     107                } catch (Exception e) { 
    100108                        AS3Plugin.getDefault().debug("error validating token", e); 
    101109                } 
     
    151159                                next = stream.getIToken(stream.getNext(token.getTokenIndex())); 
    152160                        } 
     161                        nextIsSemi = next.getKind() == Sym.TK_SEMI; 
    153162                        offsetWithinToken = Sym.isWithinToken(offset, token); 
    154                         offsetBeforeToken = token.getStartOffset() < token.getStartOffset(); 
     163                        offsetBeforeToken = offset < token.getStartOffset(); 
    155164                        if ((offsetAfterToken||offsetWithinToken) && Sym.isKeyword(token))  
    156165                                return false; 
     
    174183                for (IAst n = node; n != null; n = n.getParent()) { 
    175184                        if (n instanceof IAnnotatableDirective_full 
     185                         || n instanceof ImportDirective 
    176186                         || n instanceof PackageDefinition 
    177187                         ) { 
     
    187197                Object object = control.parse(viewer.getDocument().get(), null); 
    188198                return (object instanceof ASTNode) ? (ASTNode) object : null; 
    189         } 
    190         private String getExpectedMemberName() { 
    191                 return control.getPath().removeFileExtension().lastSegment(); 
    192         } 
    193         private String getExpectedPackageName() { 
    194                 IContainer[] sourcePaths = AS3Preferences.getSourcePaths(control.getProject().getResource()); 
    195                 IPath path = control.getPath().removeLastSegments(1); 
    196                 for (IContainer container: sourcePaths) { 
    197                         IPath srcPath = container.getFullPath().removeFirstSegments(1); 
    198                         if (srcPath.isPrefixOf(path)) { 
    199                                 path = path.removeFirstSegments(srcPath.segmentCount()); 
    200                                 return path.toString().replace('/', '.'); 
    201                         } 
    202                 } 
    203                 return ""; 
    204199        } 
    205200        /** 
     
    230225                ProposalHelper proposals = new ProposalHelper(); 
    231226                if (ast != null) { 
    232                         if (ancestors.size() > 0) { 
     227                        if (ancestors != null && ancestors.size() > 0) { 
    233228                                IAst ancestor = ancestors.get(0); 
    234229                                if (ancestor instanceof PackageDefinition) { 
     
    237232                                                // in package header 
    238233                                                IName nameNode = packdef.getName(); 
    239                                                 String packName = nameNode == null ? "" : nameNode.toString(); 
    240                                                 int startOffset = nameNode.getLeftIToken().getStartOffset(); 
    241                                                 prefix = packName; 
    242                                                 if (offset > nameNode.getLeftIToken().getStartOffset() + packName.length()) { 
    243                                                         try { 
    244                                                         prefix = viewer.getDocument().get(startOffset, offset - startOffset); 
    245                                                         } catch (Exception e) { 
    246                                                                 AS3Plugin.getDefault().debug("error fetching real name",e); 
     234                                                prefix = fetchName((IAst) nameNode); 
     235                                                IResource project = control.getProject().getResource(); 
     236                                                String expectedName = AS3Util.getExpectedPackageName(project,project.getFullPath().append(control.getPath())); 
     237                                                if (!prefix.equals(expectedName)) 
     238                                                        proposals.addSourceProposal(expectedName, prefix,PackageDefinition.class); 
     239                                        } else { 
     240                                                proposals.addUnitScopeProposals(node); 
     241                                                if (prefix.startsWith("import")) { 
     242                                                        for (String packname:Index0r.getInstance().getPackageNames()) { 
     243                                                                proposals.addSourceProposal("import "+packname+".*", prefix, ImportDirective.class, !nextIsSemi); 
    247244                                                        } 
    248245                                                } 
    249                                                 String expectedName = getExpectedPackageName(); 
    250                                                 if (!packName.equals(expectedName)) 
    251                                                         proposals.addSourceProposal(expectedName, (ASTNode) nameNode); 
    252                                         } else { 
    253                                                 proposals.addUnitScopeProposals(node); 
     246                                        } 
     247                                } else if (ancestor instanceof ImportDirective) { 
     248                                        IName nameNode = ((ImportDirective)ancestor).getName(); 
     249                                        prefix = fetchName((IAst) nameNode); 
     250                                        int dotIndex = prefix.lastIndexOf('.'); 
     251                                        Collection<String> packageNames = Index0r.getInstance().getPackageNames(); 
     252                                        if (dotIndex > 0) { 
     253                                                String packname = prefix.substring(0,dotIndex); 
     254                                                String rest = prefix.substring(dotIndex+1); 
     255                                                if (packageNames.contains(packname)) { 
     256                                                        if ("*".equals(rest)) { 
     257                                                                return proposals.getResult(); 
     258                                                        } 
     259                                                        for (AXIndex index:Index0r.getInstance().getPackages(packname)) { 
     260                                                                for (AXEntry entry:index.getEntries()) { 
     261                                                                        String entryname = entry.getName(); 
     262                                                                        if (entryname != null && (rest.length() == 0 || entryname.startsWith(rest))) { 
     263                                                                                proposals.addSourceProposal(packname+"."+entryname, prefix, ImportDirective.class, !nextIsSemi); 
     264                                                                        } 
     265                                                                } 
     266                                                                if (rest.length() == 0) { 
     267                                                                        proposals.addSourceProposal(packname+".*", prefix, ImportDirective.class, !nextIsSemi); 
     268                                                                } 
     269                                                        } 
     270                                                } 
     271                                        } 
     272                                        for (String packname:packageNames) { 
     273                                                if (packname.startsWith(prefix)) { 
     274                                                        proposals.addSourceProposal(packname+".*", prefix, ImportDirective.class, !nextIsSemi); 
     275                                                } 
    254276                                        } 
    255277                                } else { 
     
    260282                        } 
    261283                } 
    262                 if (prefix.length() > 0) { 
     284                if (prefix != null && prefix.length() > 0) { 
    263285                        proposals.addKeywordProposals(); 
    264286                        proposals.addTemplateProposals(viewer); 
    265287                } 
    266288                return proposals.getResult(); 
     289        } 
     290        protected String fetchName(IAst nameNode) { 
     291                String name = nameNode == null ? "" : nameNode.toString(); 
     292                int startOffset = nameNode == null ? offset : nameNode.getLeftIToken().getStartOffset(); 
     293                if (offset > startOffset + name.length()) { 
     294                        try { 
     295                                name = viewer.getDocument().get(startOffset, offset - startOffset); 
     296                        } catch (Exception e) { 
     297                                AS3Plugin.getDefault().debug("error fetching real name",e); 
     298                        } 
     299                } 
     300                return name; 
    267301        } 
    268302        public static final Comparator<ICompletionProposal> ProposalComparator = new Comparator<ICompletionProposal>() { 
     
    281315                                if (name.startsWith(prefix)) { 
    282316                                        IAst ast = table.findDeclaration(key); 
    283                                         result.add(new AS3SourceProposal(name, prefix, offset, ast)); 
    284                                 } 
    285                         } 
    286                 } 
    287                 void addSourceProposal(String packageName, ASTNode node) { 
    288                         result.add(new AS3SourceProposal(packageName, prefix, offset, node)); 
     317                                        result.add(new AS3SourceProposal(name, prefix, offset, ast.getClass())); 
     318                                } 
     319                        } 
     320                } 
     321                void addSourceProposal(String packageName, String usePrefix, ASTNode node) { 
     322                        result.add(new AS3SourceProposal(packageName, usePrefix, offset, node.getClass())); 
     323                } 
     324                void addSourceProposal(String packageName, String usePrefix, Class<?> nodeClass) { 
     325                        result.add(new AS3SourceProposal(packageName, usePrefix, offset, nodeClass)); 
     326                } 
     327                void addSourceProposal(String packageName, String usePrefix, Class<?> nodeClass, boolean addSemi) { 
     328                        if (addSemi) packageName += ";"; 
     329                        result.add(new AS3SourceProposal(packageName, usePrefix, offset, nodeClass)); 
    289330                } 
    290331                void addKeywordProposals() { 
  • org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3SourceProposal.java

    rc6b669e r69d1ca8  
    11package org.axdt.as3.imp.contentProposer; 
    2  
    3 import lpg.runtime.IAst; 
    42 
    53import org.axdt.as3.imp.treeModelBuilder.AS3LabelProvider; 
     
    97public class AS3SourceProposal extends SourceProposal { 
    108 
    11         private IAst node; 
     9        private Class<?> nodeClass; 
    1210 
    13         public AS3SourceProposal(String newText, String prefix, int offset, IAst node) { 
     11        public AS3SourceProposal(String newText, String prefix, int offset, Class<?> nodeClass) { 
    1412                super(newText, prefix, offset); 
    15                 this.node = node; 
     13                this.nodeClass = nodeClass; 
    1614        } 
    1715 
    1816        @Override 
    1917        public Image getImage() { 
    20                 return AS3LabelProvider.getImageFor(node); 
     18                return AS3LabelProvider.getImageForClass(nodeClass); 
    2119        } 
    2220} 
  • org.axdt.as3/src/org/axdt/as3/imp/hoverHelper/AS3HoverHelper.java

    r87f02d1 r69d1ca8  
    55import lpg.runtime.IToken; 
    66 
     7import org.axdt.as3.AS3Plugin; 
     8import org.axdt.as3.imp.parser.Ast.ASTNode; 
     9import org.axdt.axdoc.model.AXIndexNode; 
     10import org.axdt.axdoc.model.AXNode; 
     11import org.axdt.axdoc.util.Index0r; 
    712import org.eclipse.imp.editor.AnnotationHoverBase; 
    813import org.eclipse.imp.language.ServiceFactory; 
     
    1621import org.eclipse.jface.text.BadLocationException; 
    1722import org.eclipse.jface.text.source.ISourceViewer; 
    18  
    19 import org.axdt.as3.AS3Plugin; 
    20 import org.axdt.as3.imp.parser.Ast.*; 
    21 import org.axdt.axdoc.model.AXIndexNode; 
    2223 
    2324public class AS3HoverHelper extends HoverHelperBase implements IHoverHelper { 
     
    4546                        } 
    4647                } catch (BadLocationException e) { 
    47                         return "??? (BadLocationException for annotation)"; 
     48                        AS3Plugin.getDefault().log("Exception getting Annotation Hover", e); 
     49                        return null; 
    4850                } 
    4951                Object targetNode = null; // node referenced from current hover point 
     
    9698                        msg = getSubstring(parseController, def.getLeftIToken().getStartOffset(), def 
    9799                                        .getRightIToken().getEndOffset()); 
    98                 } else if (helpNode instanceof AXIndexNode) { 
     100                } else if (helpNode instanceof String) { 
     101                        msg = "id: "+ helpNode.toString()+"<br/>"; 
     102                        AXIndexNode[] found = Index0r.getInstance().find(helpNode.toString()); 
     103                        if (found.length > 0) { 
     104                                AXNode indexNode = found[0].getReference(); 
     105                                if (indexNode != null && indexNode.getAsdoc().size() > 0) { 
     106                                        msg += indexNode.getAsdoc().get(0); 
     107                                } 
     108                        } 
     109                } else if (helpNode != null) { 
    99110                        msg = helpNode.toString(); 
    100111                } 
    101                 int maxMsgLen = 80; 
    102                 if (msg == null || msg.length() == 0) return "No help available"; 
    103                 else if (msg.length() <= maxMsgLen) return msg; 
    104                 else return msg.subSequence(0, maxMsgLen) + "..."; 
     112//              int maxMsgLen = 80; 
     113                if (msg == null || msg.length() == 0) return null; 
     114//              else if (msg.length() <= maxMsgLen) return msg; 
     115//              else return msg.subSequence(0, maxMsgLen) + "..."; 
     116                return msg; 
    105117        } 
    106118 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ASTNodeLocator.java

    rc6b669e r69d1ca8  
    11package org.axdt.as3.imp.parser; 
     2 
     3import lpg.runtime.IAst; 
    24 
    35import org.eclipse.core.runtime.IPath; 
    46import org.eclipse.core.runtime.Path; 
     7import org.eclipse.imp.parser.LPGSourcePositionLocator; 
    58 
    6 import org.axdt.as3.imp.parser.Ast.ASTNode; 
    7 import org.axdt.as3.imp.parser.Ast.AbstractVisitor; 
    8 import org.eclipse.imp.parser.ISourcePositionLocator; 
    9  
    10 import lpg.runtime.*; 
    11  
    12 public class AS3ASTNodeLocator implements ISourcePositionLocator { 
    13         private final Object[] fNode = new Object[1]; 
    14  
    15         private int fStartOffset; 
    16         private int fEndOffset; 
     9public class AS3ASTNodeLocator extends LPGSourcePositionLocator { 
    1710 
    1811        public AS3ASTNodeLocator() { 
     12                this(null); 
    1913        } 
    2014 
    21         private final class NodeVisitor extends AbstractVisitor { 
    22                 public void unimplementedVisitor(String s) { 
    23                         // System.out.println("NodeVisitor.unimplementedVisitor: 
    24                         // Unimplemented"); 
    25                 } 
    26  
    27                 public boolean preVisit(IAst element) { 
    28                         int nodeStartOffset = element.getLeftIToken().getStartOffset(); 
    29                         int nodeEndOffset = element.getRightIToken().getEndOffset(); 
    30                         // System.out.println("LEGNodeLocator.NodeVisitor.preVisit(ASTNode): 
    31                         // Examining " + element.getClass().getName() + 
    32                         // " @ [" + nodeStartOffset + "->" + nodeEndOffset + ']'); 
    33  
    34                         // If this node contains the span of interest then record it 
    35                         if (nodeStartOffset <= fStartOffset && nodeEndOffset >= fEndOffset) { 
    36                                 // System.out.println("LEGNodeLocator.NodeVisitor.preVisit(ASTNode) 
    37                                 // SELECTED for offsets [" + fStartOffset + ".." + fEndOffset + 
    38                                 // "]"); 
    39                                 fNode[0] = element; 
    40                                 return true; // to continue visiting here? 
    41                         } 
    42                         return false; // to stop visiting here? 
    43                 } 
    44         } 
    45  
    46         private NodeVisitor fVisitor = new NodeVisitor(); 
    47  
    48         public Object findNode(Object ast, int offset) { 
    49                 return findNode(ast, offset, offset); 
     15        public AS3ASTNodeLocator(AS3ParseController parseController) { 
     16                super(parseController); 
    5017        } 
    5118 
    5219        public Object findNode(Object ast, int startOffset, int endOffset) { 
    53                 // System.out.println("Looking for node spanning offsets " + startOffset 
    54                 // + " => " + endOffset); 
    55                 fStartOffset = startOffset; 
    56                 fEndOffset = endOffset; 
    57                 // The following could be treated as an IASTNodeToken, but ASTNode 
    58                 // is required for the visit/preVisit method, and there's no reason 
    59                 // to use both of those types 
    60                 ((ASTNode) ast).accept(fVisitor); 
    61                 if (fNode[0] == null) { 
    62                         // System.out.println("Selected node: null"); 
    63                 } else { 
    64                         // System.out.println("Selected node: " + fNode[0] + " [" + 
    65                         // fNode[0].getLeftIToken().getStartOffset() + ".." + 
    66                         // fNode[0].getLeftIToken().getEndOffset() + "]"); 
    67                 } 
    68                 return fNode[0]; 
     20        return super.findNode(ast, startOffset, endOffset); 
    6921        } 
    7022 
    71         public int getStartOffset(Object entity) { 
     23        public IPath getPath(Object entity) { 
    7224                if (entity instanceof IAst) { 
    73                         IAst n = (IAst) entity; 
    74                         return n.getLeftIToken().getStartOffset(); 
    75                 } else if (entity instanceof IToken) { 
    76                         IToken t = (IToken) entity; 
    77                         return t.getStartOffset(); 
    78                 } 
    79                 return 0; 
     25            IAst node= (IAst) entity; 
     26            return new Path(node.getLeftIToken().getIPrsStream().getFileName()); 
     27        } 
     28        return super.getPath(entity); 
    8029        } 
    8130 
    82         public int getEndOffset(Object entity) { 
    83                 if (entity instanceof IAst) { 
    84                         IAst n = (IAst) entity; 
    85                         return n.getRightIToken().getEndOffset(); 
    86                 } else if (entity instanceof IToken) { 
    87                         IToken t = (IToken) entity; 
    88                         return t.getEndOffset(); 
     31        @Override 
     32        public int getStartOffset(Object entity) { 
     33                if (entity instanceof String) { 
     34                        return -1; 
    8935                } 
    90                 return 0; 
    91         } 
    92  
    93         public int getLength(Object entity) { 
    94                 return getEndOffset(entity) - getStartOffset(entity); 
    95         } 
    96  
    97         public IPath getPath(Object node) { 
    98                 // TODO Determine path of compilation unit containing this node 
    99                 return new Path(""); 
     36                return super.getStartOffset(entity); 
    10037        } 
    10138} 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/AS3Lexer.gi

    r5eb830a r69d1ca8  
    663663                    //-- for most of the control statements  
    664664                    //-- see http://axdt.org/ticket/151 for more info 
     665                    int lastLine = last.getLine(); 
    665666                    switch (last.getKind()) { 
    666                     case $_RPAREN: break; 
    667                     case $_LCURLY: break; 
     667                    case AS3Parsersym.TK_LCURLY: break; 
     668                    case AS3Parsersym.TK_RPAREN: 
     669                        int lineOffset = lexStream.getLineOffset(lastLine-1); 
     670                        int nextLineOffset = lexStream.getLineOffset(lastLine); 
     671                        char[] chars = lexStream.getInputChars(); 
     672                        StringBuilder buf = new StringBuilder(nextLineOffset-lineOffset); 
     673                        for (int i=lineOffset; i < chars.length && i < nextLineOffset; i++) { 
     674                           buf.append(chars[i]); 
     675                        } 
     676                        String result = buf.toString().trim(); 
     677                        if (result.contains("if")||result.contains("while")||result.contains("for")||result.contains("do")||result.contains("with")) { 
     678                            break; 
     679                        } 
    668680                    default: 
    669                         int lastLine = last.getLine(); 
    670681                        int newLine = lexStream.getLineNumberOfCharAt(startLoc);  
    671682                        // and there is a linebreak 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/AS3MessageHandler.java

    ra106cc3 r69d1ca8  
    11package org.axdt.as3.imp.parser; 
     2 
     3import org.eclipse.imp.builder.MarkerCreator; 
    24 
    35import lpg.runtime.IMessageHandler; 
     
    2729        int endCol= msgLocation[END_COLUMN_INDEX]; 
    2830 
    29         String message = ""; 
     31        StringBuilder message = new StringBuilder(); 
    3032         
    3133        if (errorCode < ParseErrorCodes.NO_MESSAGE_CODE) { 
     
    3638        } 
    3739 
    38         for (int i = 0; i < errorInfo.length; i++) 
    39             message += " " + errorInfo[i]; 
    40  
    41         handler.handleSimpleMessage(message, startOffset, startOffset + length - 1, 
     40        for (int i = 0; i < errorInfo.length; i++) { 
     41                if (i>0) message.append("; "); 
     42            message.append(errorInfo[i]); 
     43        } 
     44        int endOffset = startOffset + length -1; 
     45        if (handler instanceof MarkerCreator) endOffset++; 
     46        handler.handleSimpleMessage(message.toString(), startOffset, endOffset, 
    4247                startCol, endCol, startLine, endLine); 
    4348        } 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ParseController.java

    r87f02d1 r69d1ca8  
    11package org.axdt.as3.imp.parser; 
     2 
     3import java.util.Stack; 
    24 
    35import org.axdt.as3.AS3Plugin; 
    46import org.axdt.as3.imp.parser.Ast.ASTNode; 
     7import org.axdt.as3.imp.parser.Ast.Program; 
    58import org.eclipse.core.runtime.IPath; 
    69import org.eclipse.core.runtime.IProgressMonitor; 
     
    4851                return lexer; 
    4952        } 
    50  
    51         public ISourcePositionLocator getNodeLocator() { 
    52                 return new AS3ASTNodeLocator(); 
     53         
     54        @Override 
     55        public ISourcePositionLocator getSourcePositionLocator() { 
     56                return new AS3ASTNodeLocator(this); 
    5357        } 
    5458 
     
    5963 
    6064        public Object parse(String contents, IProgressMonitor monitor) { 
    61                 return parse(contents, false, monitor); 
     65                return parse(contents, true, monitor); 
    6266        } 
    6367        /** 
    6468         * setFilePath() should be called before calling this method. 
    6569         */ 
    66         public Object parse(String contents, boolean scanOnly, IProgressMonitor monitor) { 
     70        public Object parse(String contents, boolean resolve, IProgressMonitor monitor) { 
    6771                if (monitor == null) monitor = new NullProgressMonitor(); 
    6872                int newHash = contents.hashCode(); 
     
    7983                        lexer = new AS3Lexer(); 
    8084                } 
    81                 lexer.reset(contentsArray, fFilePath.toPortableString()); 
     85                IPath fullpath = fProject.getResource().getLocation().append(fFilePath); 
     86                lexer.reset(contentsArray, fullpath.toString()); 
    8287 
    8388                if (parser == null) { 
     
    99104 
    100105                if (fCurrentAst instanceof ASTNode) { 
    101                         parser.resolve((ASTNode) fCurrentAst); 
     106                        ASTNode node = (ASTNode) fCurrentAst; 
     107                        resolveSymbolTable(node); 
     108                        if (resolve) { 
     109                                resolveDeclarations(node); 
     110                        } 
    102111                } 
    103112 
    104113                cacheKeywordsOnce(); 
    105114 
    106                 Object result = fCurrentAst; 
    107                 return result; 
     115                return fCurrentAst; 
     116        } 
     117         
     118        protected void resolveDeclarations(ASTNode root) { 
     119                root.accept(new ResolvingVisitor(parser)); 
     120        } 
     121 
     122        protected void resolveSymbolTable(ASTNode root) { 
     123                parser.symbolTableStack = new Stack<SymbolTable>(); 
     124                parser.topLevelSymbolTable = new SymbolTable(null, Program.class); 
     125                parser.symbolTableStack.push(parser.topLevelSymbolTable); 
     126                root.accept(new SymbolTableVisitor(parser)); 
    108127        } 
    109128 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/SymbolTableVisitor.java

    r87f02d1 r69d1ca8  
    22 
    33import lpg.runtime.IAst; 
    4 import lpg.runtime.ILexStream; 
    5 import lpg.runtime.IPrsStream; 
    64import lpg.runtime.IToken; 
    7 import lpg.runtime.ParseErrorCodes; 
    85 
    9 import org.axdt.as3.imp.parser.Ast.ASTNode; 
    10 import org.axdt.as3.imp.parser.Ast.AbstractVisitor; 
    116import org.axdt.as3.imp.parser.Ast.AssignmentExpression; 
    127import org.axdt.as3.imp.parser.Ast.AttributeList; 
     
    1712import org.axdt.as3.imp.parser.Ast.FunctionExpression; 
    1813import org.axdt.as3.imp.parser.Ast.IAttributeExpression; 
    19 import org.axdt.as3.imp.parser.Ast.ImportDirective; 
    2014import org.axdt.as3.imp.parser.Ast.InterfaceDefinition; 
    21 import org.axdt.as3.imp.parser.Ast.Name; 
    2215import org.axdt.as3.imp.parser.Ast.PackageDefinition; 
    2316import org.axdt.as3.imp.parser.Ast.PlainParameter; 
     
    2518import org.axdt.as3.imp.parser.Ast.VariableBinding; 
    2619import org.axdt.as3.imp.parser.Ast.VariableDefinition; 
    27 import org.axdt.axdoc.model.AXIndex; 
    28 import org.axdt.axdoc.model.AXIndexNode; 
    29 import org.axdt.axdoc.util.Index0r; 
    3020 
    31 public class SymbolTableVisitor extends AbstractVisitor { 
    32  
    33         private final IPrsStream prs; 
    34         private final ILexStream lex; 
    35         private final AS3Parser parser; 
    36         private Index0r index0r; 
     21public class SymbolTableVisitor extends DiagnoseVisitor { 
    3722 
    3823        public SymbolTableVisitor(AS3Parser parser) { 
    39                 this.prs = parser.getIPrsStream(); 
    40                 this.lex = prs.getILexStream(); 
    41                 this.parser = parser; 
    42                 index0r = Index0r.getInstance(); 
     24                super(parser); 
    4325        } 
    4426 
     
    5133        private SymbolTable peekTable() { 
    5234                return parser.symbolTableStack.peek(); 
    53         } 
    54  
    55         public void unimplementedVisitor(String s) { 
    56                 // Useful for debugging: 
    57                 // System.out.println(s); 
    58         } 
    59  
    60         public void emitError(IToken id, String message) { 
    61                 lex.getMessageHandler().handleMessage(ParseErrorCodes.NO_MESSAGE_CODE, 
    62                                 lex.getLocation(id.getStartOffset(), id.getEndOffset()), lex.getLocation(0, 0), 
    63                                 prs.getFileName(), new String[] {message}); 
    64         } 
    65  
    66         public void emitError(ASTNode node, String message) { 
    67                 lex.getMessageHandler().handleMessage( 
    68                                 ParseErrorCodes.NO_MESSAGE_CODE, 
    69                                 lex.getLocation(node.getLeftIToken().getStartOffset(), node.getRightIToken() 
    70                                                 .getEndOffset()), lex.getLocation(0, 0), prs.getFileName(), 
    71                                 new String[] {message}); 
    72         } 
    73  
    74         public void emitError(int startOffset, int endOffset, String message) { 
    75                 lex.getMessageHandler().handleMessage(ParseErrorCodes.NO_MESSAGE_CODE, 
    76                                 lex.getLocation(startOffset, endOffset), lex.getLocation(0, 0), prs.getFileName(), 
    77                                 new String[] {message}); 
    7835        } 
    7936 
     
    8946        @Override 
    9047        public boolean visit(PackageDefinition n) { 
    91                 // check if name corresponds with folder names 
    92                 if (n.getName() != null) { 
    93                         Name name = (Name) n.getName(); 
    94                         String fileName = parser.getIPrsStream().getFileName(); 
    95                         String expectedFolder = name.toString().replace('.', '/')+"/"; 
    96                         String[] split = fileName.split("/"+expectedFolder); 
    97                         if (split.length!= 2) 
    98                                 emitError(name, "package names match the folder structure."); 
    99                         // fill declaration with false 
    100                         Name current = name; 
    101                         while (current!=null) { 
    102                                 current.getIdent().setDeclaration(Boolean.FALSE); 
    103                                 current = current.getQualifier() instanceof Name ? 
    104                                                 (Name)current.getQualifier() : null; 
    105                         } 
    106                 } 
    107                 // TODO check if split[0] is a valid source path 
    10848                return true; 
    109         } 
    110         public boolean visit(ImportDirective n) { 
    111                 Name name = (Name) n.getName(); 
    112                 boolean onDemand = n.getOnDemand()!=null; 
    113                 if (name.getQualifier()==null||onDemand) { 
    114                         if (onDemand) { 
    115                                 AXIndex[] findPackage = index0r.findPackage(name.toString()); 
    116                                 if (findPackage.length==1)  
    117                                         name.getIdent().setDeclaration(findPackage[0]); 
    118                                 else if (findPackage.length>1) 
    119                                         name.getIdent().setDeclaration(findPackage); 
    120                                 else emitError(name, "could not resolve import"); 
    121                         } else { 
    122                                 // does anyone want to import toplevel members ? 
    123                                 emitError(name, "unused import. toplevel members can be used without import?!"); 
    124                         } 
    125                 } else { 
    126                         Name qualifier = (Name) name.getQualifier(); 
    127                         AXIndexNode[] findMember = index0r.findMember(qualifier.toString(), name.getIdent().toString()); 
    128                         if (findMember.length==1)  
    129                                 name.getIdent().setDeclaration(findMember[0]); 
    130                         else if (findMember.length>1) 
    131                                 name.getIdent().setDeclaration(findMember); 
    132                         else emitError(name, "could not resolve import"); 
    133                         while (qualifier != null) { 
    134                                 qualifier.getIdent().setDeclaration(Boolean.TRUE); 
    135                                 qualifier = qualifier.getQualifier() instanceof Name ? 
    136                                         (Name) qualifier.getQualifier() : null; 
    137                         } 
    138                 } 
    139                 return false; 
    14049        } 
    14150        public boolean visit(ClassDefinition n) { 
    14251                n.setSymbolTable(pushNewTable(n.getClass())); 
    143                 Name name = (Name) n.getName(); 
    144                 checkTypeName(name); 
    145                 checkPackageDirectiveName(name); 
    14652                return true; 
    14753        } 
     
    15359        @Override 
    15460        public boolean visit(InterfaceDefinition n) { 
    155                 Name name = (Name) n.getName(); 
    156                 checkTypeName(name); 
    157                 checkPackageDirectiveName(name); 
    15861                return true; 
    159         } 
    160         private void checkTypeName(Name name) { 
    161                 if (name.getQualifier()!=null) 
    162                         emitError(name, "type names are not qualified. the package name belongs in the package declaration"); 
    163                 name.getIdent().setDeclaration(Boolean.FALSE); 
    164         } 
    165         private void checkPackageDirectiveName(Name name) { 
    166                 IAst grandp = name; 
    167                 while (grandp != null) { 
    168                         grandp = grandp.getParent(); 
    169                         if (grandp instanceof PackageDefinition) 
    170                                 break; 
    171                 } 
    172                 if (grandp != null) { 
    173                         String fileName = parser.getIPrsStream().getFileName(); 
    174                         String nameString = name.getIdent().toString(); 
    175                         if (!fileName.endsWith(nameString+".as"))  
    176                                 emitError(name, "name should match the file name"); 
    177                 } 
    17862        } 
    17963 
  • org.axdt.as3/src/org/axdt/as3/imp/referenceResolvers/AS3ReferenceResolver.java

    r87f02d1 r69d1ca8  
    55import org.axdt.as3.imp.parser.AS3Parser; 
    66import org.axdt.as3.imp.parser.SymbolTable; 
    7 import org.axdt.as3.imp.parser.Ast.IName; 
    87import org.axdt.as3.imp.parser.Ast.Ident; 
    9 import org.axdt.axdoc.model.AXIndex; 
    10 import org.axdt.axdoc.util.Index0r; 
     8import org.axdt.as3.util.AS3ASTUtil; 
    119import org.eclipse.imp.language.ILanguageService; 
    1210import org.eclipse.imp.parser.IParseController; 
     
    3836                if (node instanceof Ident) { 
    3937                        Ident id = (Ident) node; 
    40                         Object decl = id.getDeclaration(); 
    41                         if (decl != null) return decl; 
    42                         IAst parent = id.getParent(); 
    43                         String stringId = id.toString(); 
    44                         Index0r index0r = Index0r.getInstance(); 
    45                         if (parent instanceof IName) { 
    46                                 stringId = parent.toString(); 
    47                                 AXIndex[] indexes = index0r.findPackage(stringId); 
    48                                 if (indexes.length > 0) { 
    49                                         id.setDeclaration(indexes[0]); 
    50                                         return indexes[0]; 
     38                        Object decl = AS3ASTUtil.getDeclaration(id); 
     39                        if (decl == null) { 
     40                                decl = lookInSymbolTable(controller,(IAst) node,id.toString()); 
     41                                if (decl != null) { 
     42                                        id.setDeclaration(decl); 
     43                                } 
     44                        } else { 
     45                                if (Boolean.FALSE.equals(decl)) { 
     46                                        // false indicates declaration 
     47                                        // do we want to return id or relevant directive ? 
     48                                        return null; 
     49                                } 
     50                                if (String.class.equals(decl.getClass())) { 
     51                                        // TODO find indexed item with id 
     52                                        return decl; 
    5153                                } 
    5254                        } 
    53                         // find local declaration 
    54                         decl = lookInSymbolTable(controller,(IAst) node,stringId); 
    55                         if (decl != null) { 
    56                                 id.setDeclaration(decl); 
    57                                 return decl; 
    58                         } 
    59                         System.err.println(stringId); 
     55                        return decl; 
    6056                } 
    6157                return null; 
  • org.axdt.as3/src/org/axdt/as3/imp/treeModelBuilder/AS3LabelProvider.java

    r0f87444 r69d1ca8  
    8686        public static Image getImageFor(IAst n) { 
    8787                if (n == null) return null; 
    88                 if (n instanceof PackageDefinition) return OUTLINE_PACKAGE_IMAGE; 
    89                 if (n instanceof ImportDirective) return OUTLINE_IMPORT_IMAGE; 
    90                 if (n instanceof ImportDirectiveList) return OUTLINE_IMPORT_LIST_IMAGE; 
    91                 if (n instanceof ClassDefinition) return OUTLINE_CLASS_IMAGE; 
    92                 if (n instanceof InterfaceDefinition) return OUTLINE_INTERFACE_IMAGE; 
    93                 if (n instanceof VariableBinding) { 
     88                Image result = getImageForClass(n.getClass()); 
     89                if (result.equals(LOCAL_VAR_IMAGE)) { 
    9490                        IAst parent = ((VariableBinding) n).getParent().getParent(); 
    9591                        if (parent instanceof VariableDefinition) { 
     
    10399                                } 
    104100                                return OUTLINE_PUBLIC_FIELD_IMAGE; 
    105                         } else { 
    106                                 return LOCAL_VAR_IMAGE; 
    107101                        } 
    108                 } 
    109                 if (n instanceof FunctionDefinition) { 
     102                } else if (result.equals(OUTLINE_PUBLIC_METHOD_IMAGE)) { 
    110103                        FunctionDefinition method = (FunctionDefinition) n; 
    111104                        AttributeList attributes = method.getAttributes(); 
     
    119112                        } 
    120113                        if (method.isConstructor) return OUTLINE_PUBLIC_CONSTRUCTOR_IMAGE; 
    121                         return OUTLINE_PUBLIC_METHOD_IMAGE; 
    122                 } 
    123                 return null; 
     114                }  
     115                return result; 
    124116        } 
    125117 
     
    168160                fListeners.remove(listener); 
    169161        } 
     162 
     163        public static Image getImageForClass(Class<?> nodeClass) { 
     164                if (nodeClass == null) return null; 
     165                if (PackageDefinition.class.isAssignableFrom(nodeClass)) return OUTLINE_PACKAGE_IMAGE; 
     166                if (ImportDirective.class.isAssignableFrom(nodeClass)) return OUTLINE_IMPORT_IMAGE; 
     167                if (ImportDirectiveList.class.isAssignableFrom(nodeClass)) return OUTLINE_IMPORT_LIST_IMAGE; 
     168                if (ClassDefinition.class.isAssignableFrom(nodeClass)) return OUTLINE_CLASS_IMAGE; 
     169                if (InterfaceDefinition.class.isAssignableFrom(nodeClass)) return OUTLINE_INTERFACE_IMAGE; 
     170                if (VariableBinding.class.isAssignableFrom(nodeClass)) return LOCAL_VAR_IMAGE; 
     171                if (FunctionDefinition.class.isAssignableFrom(nodeClass)) return OUTLINE_PUBLIC_METHOD_IMAGE; 
     172                return null; 
     173        } 
    170174} 
  • org.axdt.as3/src/org/axdt/as3/util/AS3Util.java

    r29160e7 r69d1ca8  
    33import org.axdt.as3.preferences.AS3Preferences; 
    44import org.eclipse.core.resources.IContainer; 
     5import org.eclipse.core.resources.IFile; 
     6import org.eclipse.core.resources.IProject; 
    57import org.eclipse.core.resources.IResource; 
    68import org.eclipse.core.runtime.IPath; 
    79 
    810public class AS3Util { 
    9  
    1011        public static IContainer getSourceFolder(IResource res) { 
    1112                IContainer[] folders = AS3Preferences.getSourcePaths(res); 
     13                if (res instanceof IProject) { 
     14                        return folders[0]; 
     15                } 
    1216                for (IContainer folder:folders) { 
    1317                        if (folder.getFullPath().isPrefixOf(res.getFullPath())) { 
     
    2226                if (srcFolder == null) return ""; 
    2327                IPath srcPath = srcFolder.getFullPath(); 
    24                 IPath filePath = res.getFullPath(); 
     28                IPath filePath = res instanceof IFile ? res.getFullPath().removeLastSegments(1) : res.getFullPath(); 
    2529                int i = filePath.matchingFirstSegments(srcPath); 
    2630                IPath packge = filePath.removeFirstSegments(i); 
     
    3236                return result.toString(); 
    3337        } 
     38        public static String getExpectedMemberName(IResource res) { 
     39                return getExpectedMemberName(res.getFullPath()); 
     40        } 
     41        public static String getExpectedMemberName(IPath path) { 
     42                return path.removeFileExtension().lastSegment(); 
     43        } 
     44        public static String getExpectedPackageName(IResource file) { 
     45                return getExpectedPackageName(file, file.getFullPath()); 
     46        } 
     47        public static String getExpectedPackageName(IResource res, IPath filePath) { 
     48                IContainer[] sourcePaths = AS3Preferences.getSourcePaths(res); 
     49                filePath = filePath.removeLastSegments(1); 
     50                for (IContainer container: sourcePaths) { 
     51                        IPath srcPath = container.getFullPath(); 
     52                        if (srcPath.isPrefixOf(filePath)) { 
     53                                filePath = filePath.removeFirstSegments(srcPath.segmentCount()); 
     54                                return filePath.toString().replace('/', '.'); 
     55                        } 
     56                } 
     57                return ""; 
     58        } 
    3459} 
  • org.axdt.common/META-INF/MANIFEST.MF

    re4c3dc3 r69d1ca8  
    1212 org.eclipse.text, 
    1313 org.eclipse.debug.ui, 
    14  org.eclipse.ui.ide 
     14 org.eclipse.ui.ide, 
     15 org.eclipse.jface.text;bundle-version="3.4.2" 
    1516Eclipse-LazyStart: true 
    1617Export-Package: org.axdt.actions,