Changeset 69d1ca8cf4ab8b63f93d4467f3d504c0ffdfabb7
- Timestamp:
- 06/28/09 23:36:50 (8 months ago)
- 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
- Files:
-
- 6 added
- 15 modified
-
org.axdt.as3.debug/src/org/axdt/as3/debug/launcher/AS3LauncherDelegate.java (modified) (3 diffs)
-
org.axdt.as3/plugin.xml (modified) (1 diff)
-
org.axdt.as3/src/org/axdt/as3/imp/builders/AS3Builder.java (modified) (8 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3ContentProposer.java (modified) (13 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3SourceProposal.java (modified) (2 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/hoverHelper/AS3HoverHelper.java (modified) (4 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/hyperLink/AS3HyperLinkDetector.java (added)
-
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ASTNodeLocator.java (modified) (1 diff)
-
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3Lexer.gi (modified) (1 diff)
-
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3MessageHandler.java (modified) (3 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ParseController.java (modified) (5 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/parser/DiagnoseVisitor.java (added)
-
org.axdt.as3/src/org/axdt/as3/imp/parser/ResolvingVisitor.java (added)
-
org.axdt.as3/src/org/axdt/as3/imp/parser/SymbolTableVisitor.java (modified) (6 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/referenceResolvers/AS3ReferenceResolver.java (modified) (2 diffs)
-
org.axdt.as3/src/org/axdt/as3/imp/treeModelBuilder/AS3LabelProvider.java (modified) (4 diffs)
-
org.axdt.as3/src/org/axdt/as3/util/AS3ASTUtil.java (added)
-
org.axdt.as3/src/org/axdt/as3/util/AS3Util.java (modified) (3 diffs)
-
org.axdt.common/META-INF/MANIFEST.MF (modified) (1 diff)
-
org.axdt.common/src/org/axdt/util/URIHyperLink.java (added)
-
org.axdt.common/src/org/axdt/util/URIInput.java (added)
Legend:
- Unmodified
- Added
- Removed
-
org.axdt.as3.debug/src/org/axdt/as3/debug/launcher/AS3LauncherDelegate.java
rfc56e42 r69d1ca8 9 9 import org.axdt.as3.debug.preferences.AS3DebugPreferences; 10 10 import org.axdt.common.preferences.CompilerPreferences; 11 import org.axdt.util.URIInput; 11 12 import org.eclipse.core.resources.IContainer; 12 13 import org.eclipse.core.resources.IFile; … … 31 32 import org.eclipse.debug.core.model.IStreamsProxy; 32 33 import org.eclipse.debug.core.model.LaunchConfigurationDelegate; 33 import org.eclipse.jface.resource.ImageDescriptor;34 34 import org.eclipse.swt.program.Program; 35 35 import org.eclipse.swt.widgets.Display; 36 import org.eclipse.ui.IPersistableElement;37 import org.eclipse.ui.IURIEditorInput;38 36 import org.eclipse.ui.IWorkbench; 39 37 import org.eclipse.ui.IWorkbenchPage; … … 182 180 } 183 181 } 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 @Override223 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 74 74 language="AS3"> 75 75 </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> 76 83 </extension> 77 84 <extension -
org.axdt.as3/src/org/axdt/as3/imp/builders/AS3Builder.java
r374c0f9 r69d1ca8 1 1 package org.axdt.as3.imp.builders; 2 2 3 import java.util.HashMap; 4 5 import org.axdt.as3.AS3Plugin; 6 import org.axdt.as3.imp.parser.AS3ParseController; 7 import org.axdt.as3.preferences.AS3Preferences; 8 import org.axdt.as3.util.AS3Util; 9 import org.eclipse.core.resources.IContainer; 3 10 import org.eclipse.core.resources.IFile; 4 11 import org.eclipse.core.resources.IResource; … … 6 13 import org.eclipse.core.runtime.IProgressMonitor; 7 14 import org.eclipse.core.runtime.content.IContentDescription; 8 15 import org.eclipse.imp.builder.BuilderBase; 9 16 import org.eclipse.imp.builder.BuilderUtils; 10 17 import org.eclipse.imp.builder.MarkerCreator; 11 import org.eclipse.imp.builder.BuilderBase;12 18 import org.eclipse.imp.language.Language; 13 19 import org.eclipse.imp.language.LanguageRegistry; … … 15 21 import org.eclipse.imp.model.ModelFactory; 16 22 import org.eclipse.imp.model.ModelFactory.ModelException; 17 import org.eclipse.imp.parser.IParseController;18 23 import org.eclipse.imp.runtime.PluginBase; 19 24 import 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;24 25 25 26 /** … … 33 34 public static final String PROBLEM_MARKER_ID = AS3Plugin.PLUGIN_ID + ".imp.builder.problem"; 34 35 public static final Language LANGUAGE = LanguageRegistry.findLanguage(AS3Plugin.LANGUAGE); 36 private HashMap<IPath, AS3ParseController> files; 35 37 36 38 public AS3Builder() { 37 39 super(); 40 files = new HashMap<IPath, AS3ParseController>(); 38 41 } 39 42 … … 64 67 IPath path = file.getRawLocation(); 65 68 if (path == null) return false; 69 IContainer sourceFolder = AS3Util.getSourceFolder(file); 66 70 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; 71 72 72 73 return LANGUAGE.hasExtension(path.getFileExtension()); … … 111 112 protected void compile(final IFile file, IProgressMonitor monitor) { 112 113 try { 113 IParseController parse = new AS3ParseController(); 114 115 AS3ParseController parse = getParseController(file); 114 116 115 117 MarkerCreator marker = new MarkerCreator(file, parse, PROBLEM_MARKER_ID); … … 132 134 } 133 135 } 134 parse.parse(contents, monitor);136 parse.parse(contents, true, monitor); 135 137 136 138 } catch (ModelException e) { … … 139 141 } 140 142 } 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 } 141 155 } -
org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3ContentProposer.java
r87f02d1 r69d1ca8 2 2 3 3 import java.util.ArrayList; 4 import java.util.Collection; 4 5 import java.util.Collections; 5 6 import java.util.Comparator; … … 17 18 import org.axdt.as3.imp.parser.Ast.IAnnotatableDirective_full; 18 19 import org.axdt.as3.imp.parser.Ast.IName; 20 import org.axdt.as3.imp.parser.Ast.ImportDirective; 19 21 import org.axdt.as3.imp.parser.Ast.PackageDefinition; 20 22 import org.axdt.as3.preferences.AS3Preferences; 21 23 import org.axdt.as3.templates.AS3TemplateCompletionProcessor; 24 import org.axdt.as3.util.AS3Util; 25 import org.axdt.axdoc.model.AXEntry; 26 import org.axdt.axdoc.model.AXIndex; 27 import org.axdt.axdoc.util.Index0r; 22 28 import org.eclipse.core.resources.IContainer; 29 import org.eclipse.core.resources.IResource; 23 30 import org.eclipse.core.runtime.IPath; 24 31 import org.eclipse.imp.editor.SourceProposal; … … 59 66 60 67 private int offsetDiff; 68 69 private boolean nextIsSemi; 61 70 62 71 private void clear() { 63 offsetWithinToken = offsetAfterToken = offsetBeforeToken = false;72 offsetWithinToken = offsetAfterToken = offsetBeforeToken = nextIsSemi = false; 64 73 usingBackup = dontTrustTokens = false; 65 74 prefix = null; … … 71 80 72 81 public AS3ContentProposer() { 73 74 82 } 75 83 private boolean tokenIsValid(IToken t) { … … 84 92 } 85 93 private String tokenIsValid(IToken t, int diff, int lendiff) { 86 String text = t.toString();87 94 try { 95 String text = t.toString(); 88 96 int offset = t.getStartOffset()+diff; 89 97 int length = text.length()+lendiff; … … 97 105 return string; 98 106 } 99 } catch ( BadLocationException e) {107 } catch (Exception e) { 100 108 AS3Plugin.getDefault().debug("error validating token", e); 101 109 } … … 151 159 next = stream.getIToken(stream.getNext(token.getTokenIndex())); 152 160 } 161 nextIsSemi = next.getKind() == Sym.TK_SEMI; 153 162 offsetWithinToken = Sym.isWithinToken(offset, token); 154 offsetBeforeToken = token.getStartOffset()< token.getStartOffset();163 offsetBeforeToken = offset < token.getStartOffset(); 155 164 if ((offsetAfterToken||offsetWithinToken) && Sym.isKeyword(token)) 156 165 return false; … … 174 183 for (IAst n = node; n != null; n = n.getParent()) { 175 184 if (n instanceof IAnnotatableDirective_full 185 || n instanceof ImportDirective 176 186 || n instanceof PackageDefinition 177 187 ) { … … 187 197 Object object = control.parse(viewer.getDocument().get(), null); 188 198 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 "";204 199 } 205 200 /** … … 230 225 ProposalHelper proposals = new ProposalHelper(); 231 226 if (ast != null) { 232 if (ancestors .size() > 0) {227 if (ancestors != null && ancestors.size() > 0) { 233 228 IAst ancestor = ancestors.get(0); 234 229 if (ancestor instanceof PackageDefinition) { … … 237 232 // in package header 238 233 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); 247 244 } 248 245 } 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 } 254 276 } 255 277 } else { … … 260 282 } 261 283 } 262 if (prefix .length() > 0) {284 if (prefix != null && prefix.length() > 0) { 263 285 proposals.addKeywordProposals(); 264 286 proposals.addTemplateProposals(viewer); 265 287 } 266 288 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; 267 301 } 268 302 public static final Comparator<ICompletionProposal> ProposalComparator = new Comparator<ICompletionProposal>() { … … 281 315 if (name.startsWith(prefix)) { 282 316 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)); 289 330 } 290 331 void addKeywordProposals() { -
org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3SourceProposal.java
rc6b669e r69d1ca8 1 1 package org.axdt.as3.imp.contentProposer; 2 3 import lpg.runtime.IAst;4 2 5 3 import org.axdt.as3.imp.treeModelBuilder.AS3LabelProvider; … … 9 7 public class AS3SourceProposal extends SourceProposal { 10 8 11 private IAst node;9 private Class<?> nodeClass; 12 10 13 public AS3SourceProposal(String newText, String prefix, int offset, IAst node) {11 public AS3SourceProposal(String newText, String prefix, int offset, Class<?> nodeClass) { 14 12 super(newText, prefix, offset); 15 this.node = node;13 this.nodeClass = nodeClass; 16 14 } 17 15 18 16 @Override 19 17 public Image getImage() { 20 return AS3LabelProvider.getImageFor (node);18 return AS3LabelProvider.getImageForClass(nodeClass); 21 19 } 22 20 } -
org.axdt.as3/src/org/axdt/as3/imp/hoverHelper/AS3HoverHelper.java
r87f02d1 r69d1ca8 5 5 import lpg.runtime.IToken; 6 6 7 import org.axdt.as3.AS3Plugin; 8 import org.axdt.as3.imp.parser.Ast.ASTNode; 9 import org.axdt.axdoc.model.AXIndexNode; 10 import org.axdt.axdoc.model.AXNode; 11 import org.axdt.axdoc.util.Index0r; 7 12 import org.eclipse.imp.editor.AnnotationHoverBase; 8 13 import org.eclipse.imp.language.ServiceFactory; … … 16 21 import org.eclipse.jface.text.BadLocationException; 17 22 import 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;22 23 23 24 public class AS3HoverHelper extends HoverHelperBase implements IHoverHelper { … … 45 46 } 46 47 } catch (BadLocationException e) { 47 return "??? (BadLocationException for annotation)"; 48 AS3Plugin.getDefault().log("Exception getting Annotation Hover", e); 49 return null; 48 50 } 49 51 Object targetNode = null; // node referenced from current hover point … … 96 98 msg = getSubstring(parseController, def.getLeftIToken().getStartOffset(), def 97 99 .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) { 99 110 msg = helpNode.toString(); 100 111 } 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; 105 117 } 106 118 -
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ASTNodeLocator.java
rc6b669e r69d1ca8 1 1 package org.axdt.as3.imp.parser; 2 3 import lpg.runtime.IAst; 2 4 3 5 import org.eclipse.core.runtime.IPath; 4 6 import org.eclipse.core.runtime.Path; 7 import org.eclipse.imp.parser.LPGSourcePositionLocator; 5 8 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; 9 public class AS3ASTNodeLocator extends LPGSourcePositionLocator { 17 10 18 11 public AS3ASTNodeLocator() { 12 this(null); 19 13 } 20 14 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); 50 17 } 51 18 52 19 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); 69 21 } 70 22 71 public int getStartOffset(Object entity) {23 public IPath getPath(Object entity) { 72 24 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); 80 29 } 81 30 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; 89 35 } 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); 100 37 } 101 38 } -
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3Lexer.gi
r5eb830a r69d1ca8 663 663 //-- for most of the control statements 664 664 //-- see http://axdt.org/ticket/151 for more info 665 int lastLine = last.getLine(); 665 666 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 } 668 680 default: 669 int lastLine = last.getLine();670 681 int newLine = lexStream.getLineNumberOfCharAt(startLoc); 671 682 // and there is a linebreak -
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3MessageHandler.java
ra106cc3 r69d1ca8 1 1 package org.axdt.as3.imp.parser; 2 3 import org.eclipse.imp.builder.MarkerCreator; 2 4 3 5 import lpg.runtime.IMessageHandler; … … 27 29 int endCol= msgLocation[END_COLUMN_INDEX]; 28 30 29 String message = "";31 StringBuilder message = new StringBuilder(); 30 32 31 33 if (errorCode < ParseErrorCodes.NO_MESSAGE_CODE) { … … 36 38 } 37 39 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, 42 47 startCol, endCol, startLine, endLine); 43 48 } -
org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ParseController.java
r87f02d1 r69d1ca8 1 1 package org.axdt.as3.imp.parser; 2 3 import java.util.Stack; 2 4 3 5 import org.axdt.as3.AS3Plugin; 4 6 import org.axdt.as3.imp.parser.Ast.ASTNode; 7 import org.axdt.as3.imp.parser.Ast.Program; 5 8 import org.eclipse.core.runtime.IPath; 6 9 import org.eclipse.core.runtime.IProgressMonitor; … … 48 51 return lexer; 49 52 } 50 51 public ISourcePositionLocator getNodeLocator() { 52 return new AS3ASTNodeLocator(); 53 54 @Override 55 public ISourcePositionLocator getSourcePositionLocator() { 56 return new AS3ASTNodeLocator(this); 53 57 } 54 58 … … 59 63 60 64 public Object parse(String contents, IProgressMonitor monitor) { 61 return parse(contents, false, monitor);65 return parse(contents, true, monitor); 62 66 } 63 67 /** 64 68 * setFilePath() should be called before calling this method. 65 69 */ 66 public Object parse(String contents, boolean scanOnly, IProgressMonitor monitor) {70 public Object parse(String contents, boolean resolve, IProgressMonitor monitor) { 67 71 if (monitor == null) monitor = new NullProgressMonitor(); 68 72 int newHash = contents.hashCode(); … … 79 83 lexer = new AS3Lexer(); 80 84 } 81 lexer.reset(contentsArray, fFilePath.toPortableString()); 85 IPath fullpath = fProject.getResource().getLocation().append(fFilePath); 86 lexer.reset(contentsArray, fullpath.toString()); 82 87 83 88 if (parser == null) { … … 99 104 100 105 if (fCurrentAst instanceof ASTNode) { 101 parser.resolve((ASTNode) fCurrentAst); 106 ASTNode node = (ASTNode) fCurrentAst; 107 resolveSymbolTable(node); 108 if (resolve) { 109 resolveDeclarations(node); 110 } 102 111 } 103 112 104 113 cacheKeywordsOnce(); 105 114 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)); 108 127 } 109 128 -
org.axdt.as3/src/org/axdt/as3/imp/parser/SymbolTableVisitor.java
r87f02d1 r69d1ca8 2 2 3 3 import lpg.runtime.IAst; 4 import lpg.runtime.ILexStream;5 import lpg.runtime.IPrsStream;6 4 import lpg.runtime.IToken; 7 import lpg.runtime.ParseErrorCodes;8 5 9 import org.axdt.as3.imp.parser.Ast.ASTNode;10 import org.axdt.as3.imp.parser.Ast.AbstractVisitor;11 6 import org.axdt.as3.imp.parser.Ast.AssignmentExpression; 12 7 import org.axdt.as3.imp.parser.Ast.AttributeList; … … 17 12 import org.axdt.as3.imp.parser.Ast.FunctionExpression; 18 13 import org.axdt.as3.imp.parser.Ast.IAttributeExpression; 19 import org.axdt.as3.imp.parser.Ast.ImportDirective;20 14 import org.axdt.as3.imp.parser.Ast.InterfaceDefinition; 21 import org.axdt.as3.imp.parser.Ast.Name;22 15 import org.axdt.as3.imp.parser.Ast.PackageDefinition; 23 16 import org.axdt.as3.imp.parser.Ast.PlainParameter; … … 25 18 import org.axdt.as3.imp.parser.Ast.VariableBinding; 26 19 import 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;30 20 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; 21 public class SymbolTableVisitor extends DiagnoseVisitor { 37 22 38 23 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); 43 25 } 44 26 … … 51 33 private SymbolTable peekTable() { 52 34 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});78 35 } 79 36 … … 89 46 @Override 90 47 public boolean visit(PackageDefinition n) { 91 // check if name corresponds with folder names92 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 false100 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 path108 48 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;140 49 } 141 50 public boolean visit(ClassDefinition n) { 142 51 n.setSymbolTable(pushNewTable(n.getClass())); 143 Name name = (Name) n.getName();144 checkTypeName(name);145 checkPackageDirectiveName(name);146 52 return true; 147 53 } … … 153 59 @Override 154 60 public boolean visit(InterfaceDefinition n) { 155 Name name = (Name) n.getName();156 checkTypeName(name);157 checkPackageDirectiveName(name);158 61 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 }178 62 } 179 63 -
org.axdt.as3/src/org/axdt/as3/imp/referenceResolvers/AS3ReferenceResolver.java
r87f02d1 r69d1ca8 5 5 import org.axdt.as3.imp.parser.AS3Parser; 6 6 import org.axdt.as3.imp.parser.SymbolTable; 7 import org.axdt.as3.imp.parser.Ast.IName;8 7 import org.axdt.as3.imp.parser.Ast.Ident; 9 import org.axdt.axdoc.model.AXIndex; 10 import org.axdt.axdoc.util.Index0r; 8 import org.axdt.as3.util.AS3ASTUtil; 11 9 import org.eclipse.imp.language.ILanguageService; 12 10 import org.eclipse.imp.parser.IParseController; … … 38 36 if (node instanceof Ident) { 39 37 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; 51 53 } 52 54 } 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; 60 56 } 61 57 return null; -
org.axdt.as3/src/org/axdt/as3/imp/treeModelBuilder/AS3LabelProvider.java
r0f87444 r69d1ca8 86 86 public static Image getImageFor(IAst n) { 87 87 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)) { 94 90 IAst parent = ((VariableBinding) n).getParent().getParent(); 95 91 if (parent instanceof VariableDefinition) { … … 103 99 } 104 100 return OUTLINE_PUBLIC_FIELD_IMAGE; 105 } else {106 return LOCAL_VAR_IMAGE;107 101 } 108 } 109 if (n instanceof FunctionDefinition) { 102 } else if (result.equals(OUTLINE_PUBLIC_METHOD_IMAGE)) { 110 103 FunctionDefinition method = (FunctionDefinition) n; 111 104 AttributeList attributes = method.getAttributes(); … … 119 112 } 120 113 if (method.isConstructor) return OUTLINE_PUBLIC_CONSTRUCTOR_IMAGE; 121 return OUTLINE_PUBLIC_METHOD_IMAGE; 122 } 123 return null; 114 } 115 return result; 124 116 } 125 117 … … 168 160 fListeners.remove(listener); 169 161 } 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 } 170 174 } -
org.axdt.as3/src/org/axdt/as3/util/AS3Util.java
r29160e7 r69d1ca8 3 3 import org.axdt.as3.preferences.AS3Preferences; 4 4 import org.eclipse.core.resources.IContainer; 5 import org.eclipse.core.resources.IFile; 6 import org.eclipse.core.resources.IProject; 5 7 import org.eclipse.core.resources.IResource; 6 8 import org.eclipse.core.runtime.IPath; 7 9 8 10 public class AS3Util { 9 10 11 public static IContainer getSourceFolder(IResource res) { 11 12 IContainer[] folders = AS3Preferences.getSourcePaths(res); 13 if (res instanceof IProject) { 14 return folders[0]; 15 } 12 16 for (IContainer folder:folders) { 13 17 if (folder.getFullPath().isPrefixOf(res.getFullPath())) { … … 22 26 if (srcFolder == null) return ""; 23 27 IPath srcPath = srcFolder.getFullPath(); 24 IPath filePath = res .getFullPath();28 IPath filePath = res instanceof IFile ? res.getFullPath().removeLastSegments(1) : res.getFullPath(); 25 29 int i = filePath.matchingFirstSegments(srcPath); 26 30 IPath packge = filePath.removeFirstSegments(i); … … 32 36 return result.toString(); 33 37 } 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 } 34 59 } -
org.axdt.common/META-INF/MANIFEST.MF
re4c3dc3 r69d1ca8 12 12 org.eclipse.text, 13 13 org.eclipse.debug.ui, 14 org.eclipse.ui.ide 14 org.eclipse.ui.ide, 15 org.eclipse.jface.text;bundle-version="3.4.2" 15 16 Eclipse-LazyStart: true 16 17 Export-Package: org.axdt.actions,
