Changeset 87f02d16be3ad1849f47a8a1e5c588a5924d4677

Show
Ignore:
Timestamp:
06/28/09 23:36:49 (9 months ago)
Author:
mb0 <mb0@…>
git-author:
mb0 <mb0@mb0.org> / 2009-05-31T16:03:28Z+0200
Parents:
79dd6994d81bd77cd232a3d55e8531b73adf71aa
Children:
369d8ecb6239f8f96d0abe435a0b50d8fbaabb9a
git-committer:
mb0 <mb0@mb0.org> / 2009-06-28T23:36:49Z+0200
Message:

parser controller: addded content hash to skip parsing same input.
content proposer: recalculated basic info. simple package name proposal.
as3 grammar: added comment to explain difference with the specifications.

  • type expression as return type conflicts with void statement

template proposal can reuse prefix.
moved axdoc parser and tagsoup dependency to org.axdt.axdoc
added debugging option.
axdt now starts to utilize axdoc

Files:
11 added
1 removed
29 modified
3 moved

Legend:

Unmodified
Added
Removed
  • org.axdt.as3/META-INF/MANIFEST.MF

    rf136e7c r87f02d1  
    1414 org.eclipse.ui.workbench.texteditor, 
    1515 org.axdt.common, 
    16  org.eclipse.ui.editors 
     16 org.eclipse.ui.editors, 
     17 org.axdt.axdoc.model, 
     18 org.axdt.axdoc 
    1719Eclipse-LazyStart: true 
    1820Bundle-Activator: org.axdt.as3.AS3Plugin 
  • org.axdt.as3/src/org/axdt/as3/AS3Plugin.java

    r0f87444 r87f02d1  
    55 
    66import org.axdt.as3.templates.AS3ContextType; 
     7import org.axdt.common.preferences.AxdtPreferences; 
    78import org.eclipse.core.runtime.FileLocator; 
    89import org.eclipse.core.runtime.IPath; 
     
    4849        } 
    4950 
    50         /* 
    51          * (non-Javadoc) 
    52          *  
    53          * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) 
    54          */ 
     51        @Override 
    5552        public void start(BundleContext context) throws Exception { 
    5653                super.start(context); 
     
    134131        } 
    135132 
     133        public void debug(String msg) { 
     134                debug(msg, null); 
     135        } 
     136 
     137        public void debug(String msg, Exception e) { 
     138                if (AxdtPreferences.doDebug()) { 
     139                        int statusType = e == null ? Status.INFO : Status.WARNING; 
     140                        getLog().log(new Status(statusType, PLUGIN_ID, Status.OK, msg, e)); 
     141                } 
     142        } 
     143 
    136144        @Override 
    137145        public String getLanguageID() { 
  • org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3ContentProposer.java

    r1d13b65 r87f02d1  
    11package org.axdt.as3.imp.contentProposer; 
    22 
    3 import org.axdt.as3.imp.parser.*; 
    4 import org.axdt.as3.imp.parser.Ast.*; 
     3import java.util.ArrayList; 
     4import java.util.Collections; 
     5import java.util.Comparator; 
     6 
     7import lpg.runtime.IAst; 
     8import lpg.runtime.IPrsStream; 
     9import lpg.runtime.IToken; 
     10 
     11import org.axdt.as3.AS3Plugin; 
     12import org.axdt.as3.imp.parser.AS3ASTNodeLocator; 
     13import org.axdt.as3.imp.parser.AS3ParseController; 
     14import org.axdt.as3.imp.parser.AS3Parsersym; 
     15import org.axdt.as3.imp.parser.SymbolTable; 
     16import org.axdt.as3.imp.parser.Ast.ASTNode; 
     17import org.axdt.as3.imp.parser.Ast.IAnnotatableDirective_full; 
     18import org.axdt.as3.imp.parser.Ast.IName; 
     19import org.axdt.as3.imp.parser.Ast.PackageDefinition; 
     20import org.axdt.as3.preferences.AS3Preferences; 
    521import org.axdt.as3.templates.AS3TemplateCompletionProcessor; 
    6  
    7 import lpg.runtime.*; 
    8  
    9 import java.util.*; 
    10  
    11 import org.eclipse.jface.text.contentassist.ICompletionProposal; 
    12 import org.eclipse.jface.text.ITextViewer; 
    13 import org.eclipse.imp.services.IContentProposer; 
     22import org.eclipse.core.resources.IContainer; 
     23import org.eclipse.core.runtime.IPath; 
    1424import org.eclipse.imp.editor.SourceProposal; 
    1525import org.eclipse.imp.parser.IParseController; 
    16 import org.eclipse.imp.parser.SimpleLPGParseController; 
     26import org.eclipse.imp.services.IContentProposer; 
     27import org.eclipse.jface.text.BadLocationException; 
     28import org.eclipse.jface.text.ITextViewer; 
     29import org.eclipse.jface.text.contentassist.ICompletionProposal; 
    1730 
    1831public class AS3ContentProposer implements IContentProposer { 
    19  
    20         private static final String[] keywords = new String[] {"public", "private", "protected", 
    21                         "internal", "static", "final", "dynamic", "override", "class", "interface", "use", 
    22                         "namespace", "function", "var", "const", "import"}; 
     32         
     33        private static AS3ASTNodeLocator locator = new AS3ASTNodeLocator(); 
     34         
     35        private boolean offsetWithinToken; 
     36        private boolean usingBackup; 
     37        private int offset; 
     38        private AS3ParseController control; 
     39        private IToken token; 
     40        private String prefix; 
     41        private ASTNode ast; 
     42        private ASTNode node; 
     43 
     44        private ArrayList<IAst> ancestors; 
     45 
     46        private IToken previous; 
     47 
     48        private IToken next; 
     49 
     50        private boolean offsetAfterToken; 
     51 
     52        private ITextViewer viewer; 
     53 
     54        private boolean dontTrustTokens; 
     55 
     56        private int originalOffset; 
     57 
     58        private boolean offsetBeforeToken; 
     59 
     60        private int offsetDiff; 
     61         
     62        private void clear() { 
     63                offsetWithinToken = offsetAfterToken = offsetBeforeToken = false; 
     64                usingBackup = dontTrustTokens = false; 
     65                prefix = null;  
     66                ancestors = null; 
     67                token = previous = next = null; 
     68                ast = node = null; 
     69                originalOffset = offset; 
     70        } 
    2371 
    2472        public AS3ContentProposer() { 
    25         } 
    26  
    27         private IToken getToken(IParseController controller, int offset) { 
    28                 IPrsStream stream = ((SimpleLPGParseController) controller).getParser().getIPrsStream(); 
    29                 int index = stream.getTokenIndexAtCharacter(offset), token_index = (index < 0 ? -(index - 1) 
    30                                 : index), previous_index = stream.getPrevious(token_index); 
    31                 if ((stream.getKind(previous_index) == AS3Parsersym.TK_IDENTIFIER || ((AS3ParseController) controller) 
    32                                 .isKeyword(stream.getKind(previous_index)))) { 
    33                         return stream.getIToken(previous_index); 
    34                 } 
    35                 return stream.getIToken(token_index); 
    36         } 
    37  
    38         private String getPrefix(IToken token, int offset) { 
    39                 if (token.getKind() == AS3Parsersym.TK_IDENTIFIER) 
    40                         if (offset >= token.getStartOffset() && offset <= token.getEndOffset() + 1) 
    41                                 return token.toString().substring(0, offset - token.getStartOffset()); 
     73                 
     74        } 
     75        private boolean tokenIsValid(IToken t) { 
     76                String text = t.toString(); 
     77                try { 
     78                        String string = viewer.getDocument().get(t.getStartOffset(), text.length()); 
     79                        return text.equals(string); 
     80                } catch (BadLocationException e) { 
     81                        AS3Plugin.getDefault().debug("error validating token", e); 
     82                } 
     83                return false; 
     84        } 
     85        private String tokenIsValid(IToken t, int diff, int lendiff) { 
     86                String text = t.toString(); 
     87                try { 
     88                        int offset = t.getStartOffset()+diff; 
     89                        int length = text.length()+lendiff; 
     90                        String string = viewer.getDocument().get(offset, length); 
     91                        if (lendiff>0) { 
     92                                if (string.startsWith(text)) { 
     93                                        return string; 
     94                                } 
     95                        } else if (diff != 0) { 
     96                                if (text.equals(string)) 
     97                                        return string; 
     98                        } 
     99                } catch (BadLocationException e) { 
     100                        AS3Plugin.getDefault().debug("error validating token", e); 
     101                } 
     102                return null; 
     103        } 
     104        protected boolean collectInfo(IParseController controller, int offset, ITextViewer viewer) { 
     105                this.viewer = viewer; 
     106                this.control = (AS3ParseController) controller; 
     107                this.offset = offset; 
     108                offsetDiff = offset - originalOffset; 
     109                ASTNode newast = getAst(); 
     110                if (newast != null && newast == ast) { 
     111                        AS3Plugin.getDefault().debug("using old ast nothing changed"); 
     112                        return true; 
     113                } 
     114                if (newast == null) { 
     115                        AS3Plugin.getDefault().debug("no ast available try to recover"); 
     116                        Object backupAst = control.getBackupAst(); 
     117                        if (! (backupAst instanceof ASTNode)) { 
     118                                AS3Plugin.getDefault().debug("no backup ast. recover failed."); 
     119                                return false; 
     120                        } 
     121                        newast = (ASTNode) backupAst; 
     122                        String validPrefix = tokenIsValid(token,0,offsetDiff); 
     123                        if (validPrefix != null) { 
     124                                if (offsetDiff>0) { 
     125                                        boolean previousIsValid = tokenIsValid(previous); 
     126                                        boolean nextIsValid = null != tokenIsValid(next,offsetDiff,0); 
     127                                        if (previousIsValid && nextIsValid) { 
     128                                                prefix = validPrefix; 
     129                                                dontTrustTokens = true; 
     130                                                this.offset = offset;   
     131                                                AS3Plugin.getDefault().debug("recovery ok."); 
     132                                                return true; 
     133                                        } 
     134                                } 
     135                        } 
     136                        return false; 
     137                } 
     138                clear(); 
     139                try { 
     140                        ast = newast; 
     141                        IPrsStream stream = control.getParser().getIPrsStream(); 
     142                        int index = stream.getTokenIndexAtCharacter(offset); 
     143                        token = getToken(stream, index < 0 ? -index + 1: index); 
     144                        previous = getToken(stream, token.getTokenIndex()-1); 
     145                        if (previous.getEndOffset() == offset - 1) { 
     146                                offsetAfterToken = true; 
     147                                next = token; 
     148                                token = previous; 
     149                                previous = stream.getIToken(token.getTokenIndex()-1); 
     150                        } else { 
     151                                next = stream.getIToken(stream.getNext(token.getTokenIndex())); 
     152                        } 
     153                        offsetWithinToken = Sym.isWithinToken(offset, token); 
     154                        offsetBeforeToken = token.getStartOffset() < token.getStartOffset(); 
     155                        if ((offsetAfterToken||offsetWithinToken) && Sym.isKeyword(token))  
     156                                return false; 
     157                        this.prefix = offsetWithinToken ? Sym.getPrefix(offset, token)  
     158                                        : ( offsetAfterToken ? token.toString() : ""); 
     159                        node = getNode(token); 
     160                        collectAncestorInfo(node); 
     161                } catch (Exception e) { 
     162                        AS3Plugin.getDefault().debug("error collecting context info for completion proposals", e); 
     163                } 
     164                return true; 
     165        } 
     166        private IToken getToken(IPrsStream s, int index) { 
     167                IToken result = s.getIToken(index); 
     168                if (result.getKind() == Sym.TK_VirtualSemicolon) 
     169                        result = s.getIToken(index-1); 
     170                return result; 
     171        } 
     172        private void collectAncestorInfo(ASTNode node) { 
     173                ancestors = new ArrayList<IAst>(); 
     174                for (IAst n = node; n != null; n = n.getParent()) { 
     175                        if (n instanceof IAnnotatableDirective_full 
     176                         || n instanceof PackageDefinition 
     177                         ) { 
     178                                ancestors.add(n); 
     179                        } 
     180                } 
     181        } 
     182        private ASTNode getNode(IToken t) { 
     183                Object object = locator.findNode(ast, t.getStartOffset(), t.getEndOffset()); 
     184                return (object instanceof ASTNode) ? (ASTNode) object : null; 
     185        } 
     186        private ASTNode getAst() { 
     187                Object object = control.parse(viewer.getDocument().get(), null); 
     188                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                } 
    42203                return ""; 
    43204        } 
    44  
    45205        /** 
    46206         * Returns an array of content proposals applicable relative to the AST of 
     
    64224        public ICompletionProposal[] getContentProposals(IParseController controller, int offset, 
    65225                        ITextViewer viewer) { 
    66                 // a list of proposals. 
    67                 ArrayList<ICompletionProposal> list = new ArrayList<ICompletionProposal>(); 
    68                 IToken token = getToken(controller, offset); 
    69                 boolean hasspace = offset > token.getEndOffset() + 1; 
    70                 boolean isBackup = false; 
    71                 String prefix = getPrefix(token, offset); 
    72                 AS3ASTNodeLocator locator = new AS3ASTNodeLocator(); 
    73                 AS3ParseController pc = (AS3ParseController)controller; 
    74  
    75                 Object ast = controller.getCurrentAst(); 
    76                 if (ast == null) { 
    77                         ast = pc.getBackupAst(); 
    78                         isBackup = true; 
    79                 } 
     226                boolean precede = collectInfo(controller, offset, viewer); 
     227                if (!precede) { 
     228                        return new ICompletionProposal[0]; 
     229                } 
     230                ProposalHelper proposals = new ProposalHelper(); 
    80231                if (ast != null) { 
    81                         ASTNode node = (ASTNode) locator.findNode(ast, token.getStartOffset(), token.getEndOffset()); 
    82                         addUnitScopeProposals(list, node, prefix, offset); 
    83                         if (!isBackup && node != null) { 
    84                                 if (!hasspace && node instanceof IAttribute 
    85                                                 || node.getParent() instanceof PackageDefinition 
    86                                                 || node.getParent() instanceof Program) { 
    87                                         for (String key:keywords) { 
    88                                                 if (key.substring(0, key.length() - 1).startsWith(prefix)) { 
    89                                                         SourceProposal proposal = new SourceProposal(key, prefix, offset); 
    90                                                         list.add(proposal); 
     232                        if (ancestors.size() > 0) { 
     233                                IAst ancestor = ancestors.get(0); 
     234                                if (ancestor instanceof PackageDefinition) { 
     235                                        PackageDefinition packdef = (PackageDefinition)ancestor; 
     236                                        if (packdef.getBody() == null || offset < packdef.getBody().getLeftIToken().getStartOffset()+offsetDiff) { 
     237                                                // in package header 
     238                                                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); 
     247                                                        } 
    91248                                                } 
     249                                                String expectedName = getExpectedPackageName(); 
     250                                                if (!packName.equals(expectedName)) 
     251                                                        proposals.addSourceProposal(expectedName, (ASTNode) nameNode); 
     252                                        } else { 
     253                                                proposals.addUnitScopeProposals(node); 
    92254                                        } 
    93                                 } 
    94                         } 
    95                 } 
    96                 // if prefix is at least one char show template proposals 
     255                                } else { 
     256                                        proposals.addUnitScopeProposals(node); 
     257                                } 
     258                        } else { 
     259                                // parent is ast 
     260                        } 
     261                } 
    97262                if (prefix.length() > 0) { 
    98                         AS3TemplateCompletionProcessor templateProcessor = new AS3TemplateCompletionProcessor(); 
    99                         ICompletionProposal[] templateProposals = templateProcessor.computeCompletionProposals( 
    100                                         viewer, offset); 
    101                         for (ICompletionProposal prop:templateProposals) 
    102                                 list.add(prop); 
    103                 } 
    104                 Collections.sort(list, new ASProposalComparator()); 
    105                 return list.toArray(new ICompletionProposal[list.size()]); 
    106         } 
    107         private void addUnitScopeProposals(ArrayList<ICompletionProposal> list, ASTNode node, 
    108                         String prefix, int offset) { 
    109                 SymbolTable table = SymbolTable.getEnclosing(node); 
    110                 if (table != null) { 
    111                         List<String> allKeys = table.getAllKeys(null); 
    112                         for (String key:allKeys) { 
     263                        proposals.addKeywordProposals(); 
     264                        proposals.addTemplateProposals(viewer); 
     265                } 
     266                return proposals.getResult(); 
     267        } 
     268        public static final Comparator<ICompletionProposal> ProposalComparator = new Comparator<ICompletionProposal>() { 
     269                public int compare(ICompletionProposal p1, ICompletionProposal p2) { 
     270                        return p1.getDisplayString().compareTo(p2.getDisplayString()); 
     271                } 
     272        }; 
     273        private class ProposalHelper implements AS3Parsersym { 
     274                ArrayList<ICompletionProposal> result = new ArrayList<ICompletionProposal>(); 
     275                 
     276                void addUnitScopeProposals(ASTNode node) { 
     277                        SymbolTable table = SymbolTable.getEnclosing(node); 
     278                        if (table == null) return; 
     279                        for (String key:table.getAllKeys(null)) { 
    113280                                String name = table.cleanName(key); 
    114281                                if (name.startsWith(prefix)) { 
    115282                                        IAst ast = table.findDeclaration(key); 
    116                                         list.add(new AS3SourceProposal(name, prefix, offset, ast)); 
    117                                 } 
    118                         } 
    119                 } 
    120         } 
    121  
    122         public class ASProposalComparator implements Comparator<ICompletionProposal> { 
    123                 public int compare(ICompletionProposal p1, ICompletionProposal p2) { 
    124                         return p1.getDisplayString().compareTo(p2.getDisplayString()); 
     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)); 
     289                } 
     290                void addKeywordProposals() { 
     291                        for (String key:Sym.getKeyWords()) { 
     292                                if (!key.equals(prefix) && key.startsWith(prefix)) { 
     293                                        SourceProposal proposal = new SourceProposal(key, prefix, offset); 
     294                                        result.add(proposal); 
     295                                } 
     296                        } 
     297                } 
     298                void addTemplateProposals(ITextViewer viewer) { 
     299                        AS3TemplateCompletionProcessor processor = new AS3TemplateCompletionProcessor(); 
     300                        result.addAll(processor.computeCompletionProposalList(viewer, offset, prefix)); 
     301                } 
     302                ICompletionProposal[] getResult() { 
     303                        Collections.sort(result, ProposalComparator); 
     304                        return result.toArray(new ICompletionProposal[result.size()]); 
     305                } 
     306        } 
     307        public static class Sym implements AS3Parsersym { 
     308                private static String[] keywords = null; 
     309                 
     310                public static String[] getKeyWords() { 
     311                        if (keywords == null) 
     312                                keywords = createKeywords(); 
     313                        return keywords; 
     314                } 
     315                 
     316                public static boolean isKeyword(IToken t) { 
     317                        int kind = t.getKind(); 
     318                        if (kind > 1 && kind < orderedTerminalSymbols.length) { 
     319                                return orderedTerminalSymbols[kind].charAt(0) > 'Z'; 
     320                        } 
     321                        return false; 
     322                } 
     323 
     324                public static String getPrefix(int o, IToken t) { 
     325                        return t.getKind() == Sym.TK_IDENTIFIER ? 
     326                                        t.toString().substring(0, o-t.getStartOffset()) : ""; 
     327                } 
     328 
     329                public static boolean isWithinToken(int o, IToken t) { 
     330                        return o >= t.getStartOffset() && o <= t.getEndOffset(); 
     331                } 
     332                 
     333                private static String[] createKeywords() { 
     334                        ArrayList<String> result = new ArrayList<String>(); 
     335                        for (int i = 1; i < orderedTerminalSymbols.length; i++) { 
     336                                if (orderedTerminalSymbols[i].charAt(0) > 'Z') 
     337                                        result.add(orderedTerminalSymbols[i]); 
     338                        } 
     339                        return result.toArray(new String[result.size()]); 
    125340                } 
    126341        } 
  • org.axdt.as3/src/org/axdt/as3/imp/hoverHelper/AS3HoverHelper.java

    r1d13b65 r87f02d1  
    1919import org.axdt.as3.AS3Plugin; 
    2020import org.axdt.as3.imp.parser.Ast.*; 
     21import org.axdt.axdoc.model.AXIndexNode; 
    2122 
    2223public class AS3HoverHelper extends HoverHelperBase implements IHoverHelper { 
     
    4647                        return "??? (BadLocationException for annotation)"; 
    4748                } 
    48  
    49                 // Otherwise, return a message determined directly or indirectly based 
    50                 // on the node whose representation occurs at the given offset 
    51  
     49                Object targetNode = null; // node referenced from current hover point 
     50                Object helpNode = null; // node for which a help message is to be 
     51                Object sourceNode = null; // node at current hover point 
     52                // constructed 
     53                String msg = null; // the help message for helpNode 
    5254                // Get the current AST; no AST implies no message 
    5355                Object ast = parseController.getCurrentAst(); 
    54                 if (ast == null) return null; 
     56                if (ast != null) { 
    5557 
    56                 // Declare variables used in formulating the message 
    57                 Object sourceNode = null; // node at current hover point 
    58                 Object targetNode = null; // node referenced from current hover point 
    59                 Object helpNode = null; // node for which a help message is to be 
    60                 // constructed 
    61                 String msg = null; // the help message for helpNode 
     58                        // Declare variables used in formulating the message 
    6259 
    63                 // Get the node at the given offset; no node implies no message 
    64                 ISourcePositionLocator nodeLocator = parseController.getSourcePositionLocator(); 
    65                 sourceNode = nodeLocator.findNode(ast, offset); 
    66                 if (sourceNode == null) return null; 
     60                        // Get the node at the given offset; no node implies no message 
     61                        ISourcePositionLocator nodeLocator = parseController.getSourcePositionLocator(); 
     62                        sourceNode = nodeLocator.findNode(ast, offset); 
     63                        if (sourceNode != null) { 
     64                                if (fResolver == null && fLanguage != null) { 
     65                                        try { 
     66                                                fResolver = ServiceFactory.getInstance().getReferenceResolver(fLanguage); 
     67                                        } catch (Exception e) { 
     68                                                AS3Plugin.getDefault().log("Exception getting Reference Resolver service from service factory", e); 
     69                                                fResolver = null; 
     70                                        } 
     71                                } 
     72                                if (fResolver != null) { 
     73                                        targetNode = fResolver.getLinkTarget(sourceNode, parseController); 
     74                                        if (targetNode != null) helpNode = targetNode; 
     75                                } 
     76                        } 
     77                        IDocumentationProvider docProvider = null; 
     78                        if (fLanguage != null && true) { 
     79                                try { 
     80                                        docProvider = ServiceFactory.getInstance().getDocumentationProvider(fLanguage); 
    6781 
    68                 // Check whether there is a reference resolver for the identified 
    69                 // source node; if so, attempt to get the node that is referenced by 
    70                 // the source node, on the assumption that the referenced node should 
    71                 // be the basis for the help message (e.g., as a decl for an identifier) 
    72                 if (true) { 
    73                         if (fResolver == null && fLanguage != null) { 
    74                                 try { 
    75                                         fResolver = ServiceFactory.getInstance().getReferenceResolver(fLanguage); 
    7682                                } catch (Exception e) { 
    77                                         AS3Plugin.getDefault().log("Exception getting Reference Resolver service from service factory", e); 
     83                                        AS3Plugin.getDefault().log("Exception getting Documentation Provider Service from service factory", e); 
    7884                                        fResolver = null; 
    7985                                } 
    8086                        } 
    81                         if (fResolver != null) { 
    82                                 targetNode = fResolver.getLinkTarget(sourceNode, parseController); 
     87                        if (docProvider != null) { 
     88                                msg = (docProvider != null) ? docProvider.getDocumentation(helpNode, parseController) 
     89                                                : null; 
     90                                if (msg != null) return msg; 
    8391                        } 
    84                 } 
    85  
    86                 // If the target node is not null, provide help based on that; 
    87                 // otherwise, provide help based on the source node 
    88                 if (targetNode != null) helpNode = targetNode; 
    89                 else helpNode = sourceNode; 
    90  
    91                 // Now need to determine whether the help message should be determined 
    92                 // based on the text represented by the node or based on some separate 
    93                 // text provided through an IDocumentationProvider 
    94  
    95                 // Check whether there is a documentation provider for the language; 
    96                 // if so, check whether it provides documentation for the help node; 
    97                 // if so, return that documentation 
    98                 IDocumentationProvider docProvider = null; 
    99                 if (fLanguage != null && true) { 
    100                         try { 
    101                                 docProvider = ServiceFactory.getInstance().getDocumentationProvider(fLanguage); 
    102  
    103                         } catch (Exception e) { 
    104                                 AS3Plugin.getDefault().log("Exception getting Documentation Provider Service from service factory", e); 
    105                                 fResolver = null; 
    106                         } 
    107                 } 
    108                 if (docProvider != null) { 
    109                         msg = (docProvider != null) ? docProvider.getDocumentation(helpNode, parseController) 
    110                                         : null; 
    111                         if (msg != null) return msg; 
    112                 } 
    113  
    114                 // Otherwise, base the help message on the text that is represented 
    115                 // by the help node 
     92                }   
     93                 
    11694                if (helpNode instanceof ASTNode) { 
    11795                        ASTNode def = (ASTNode) helpNode; 
    11896                        msg = getSubstring(parseController, def.getLeftIToken().getStartOffset(), def 
    11997                                        .getRightIToken().getEndOffset()); 
    120                         int maxMsgLen = 80; 
    121                         if (msg == null || msg.length() == 0) return "No help available"; 
    122                         else if (msg.length() <= maxMsgLen) return msg; 
    123                         else return msg.subSequence(0, maxMsgLen) + "..."; 
    124                 } else { 
    125                         return "No help available"; 
     98                } else if (helpNode instanceof AXIndexNode) { 
     99                        msg = helpNode.toString(); 
    126100                } 
     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) + "..."; 
    127105        } 
    128106 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ParseController.java

    ra106cc3 r87f02d1  
    55import org.eclipse.core.runtime.IPath; 
    66import org.eclipse.core.runtime.IProgressMonitor; 
    7 import org.eclipse.imp.services.ILanguageSyntaxProperties; 
     7import org.eclipse.core.runtime.NullProgressMonitor; 
    88import org.eclipse.imp.model.ISourceProject; 
    99import org.eclipse.imp.parser.ILexer; 
     
    1212import org.eclipse.imp.parser.IParser; 
    1313import org.eclipse.imp.parser.ISourcePositionLocator; 
    14 import org.eclipse.imp.parser.MessageHandlerAdapter; 
    1514import org.eclipse.imp.parser.SimpleLPGParseController; 
     15import org.eclipse.imp.services.ILanguageSyntaxProperties; 
    1616 
    1717public class AS3ParseController extends SimpleLPGParseController implements IParseController { 
     
    2121 
    2222        private Object backupAst; 
     23 
     24        private int lastHash; 
    2325 
    2426        public AS3ParseController() { 
     
    6365         */ 
    6466        public Object parse(String contents, boolean scanOnly, IProgressMonitor monitor) { 
     67                if (monitor == null) monitor = new NullProgressMonitor(); 
     68                int newHash = contents.hashCode(); 
     69                if (lastHash == newHash) { 
     70                        AS3Plugin.getDefault().debug("skip parsing. nothing changed"); 
     71                        return fCurrentAst; 
     72                } 
     73                AS3Plugin.getDefault().debug("parsing "+ getPath().toString()); 
     74                lastHash = newHash; 
    6575                PMMonitor my_monitor = new PMMonitor(monitor); 
    6676                char[] contentsArray = contents.toCharArray(); 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/AS3Parser.g

    ra106cc3 r87f02d1  
    943943-- 17.2.4 Result type 
    944944ResultType ::= %empty 
    945 ResultType$ResultType ::= COLON$ PostfixExpression$Type 
     945-- use postfixexpression because of conflict with void expression 
     946ResultType$ResultType ::= COLON$ PostfixExpression$Type  
    946947ResultType$ResultType ::= COLON$ void$Void 
    947948 
  • org.axdt.as3/src/org/axdt/as3/imp/parser/SymbolTableVisitor.java

    r01bd3b5 r87f02d1  
    1717import org.axdt.as3.imp.parser.Ast.FunctionExpression; 
    1818import org.axdt.as3.imp.parser.Ast.IAttributeExpression; 
     19import org.axdt.as3.imp.parser.Ast.ImportDirective; 
     20import org.axdt.as3.imp.parser.Ast.InterfaceDefinition; 
     21import org.axdt.as3.imp.parser.Ast.Name; 
     22import org.axdt.as3.imp.parser.Ast.PackageDefinition; 
    1923import org.axdt.as3.imp.parser.Ast.PlainParameter; 
    2024import org.axdt.as3.imp.parser.Ast.RestParameter; 
    2125import org.axdt.as3.imp.parser.Ast.VariableBinding; 
    2226import org.axdt.as3.imp.parser.Ast.VariableDefinition; 
     27import org.axdt.axdoc.model.AXIndex; 
     28import org.axdt.axdoc.model.AXIndexNode; 
     29import org.axdt.axdoc.util.Index0r; 
    2330 
    2431public class SymbolTableVisitor extends AbstractVisitor { 
     
    2734        private final ILexStream lex; 
    2835        private final AS3Parser parser; 
     36        private Index0r index0r; 
    2937 
    3038        public SymbolTableVisitor(AS3Parser parser) { 
     
    3240                this.lex = prs.getILexStream(); 
    3341                this.parser = parser; 
     42                index0r = Index0r.getInstance(); 
    3443        } 
    3544 
     
    7887        } 
    7988 
     89        @Override 
     90        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 
     108                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        } 
    80141        public boolean visit(ClassDefinition n) { 
    81142                n.setSymbolTable(pushNewTable(n.getClass())); 
     143                Name name = (Name) n.getName(); 
     144                checkTypeName(name); 
     145                checkPackageDirectiveName(name); 
    82146                return true; 
    83147        } 
     
    85149        public void endVisit(ClassDefinition n) { 
    86150                parser.symbolTableStack.pop(); 
     151        } 
     152         
     153        @Override 
     154        public boolean visit(InterfaceDefinition n) { 
     155                Name name = (Name) n.getName(); 
     156                checkTypeName(name); 
     157                checkPackageDirectiveName(name); 
     158                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                } 
    87178        } 
    88179 
  • org.axdt.as3/src/org/axdt/as3/imp/referenceResolvers/AS3ReferenceResolver.java

    rc6b669e r87f02d1  
    33import lpg.runtime.IAst; 
    44 
     5import org.axdt.as3.imp.parser.AS3Parser; 
     6import org.axdt.as3.imp.parser.SymbolTable; 
     7import org.axdt.as3.imp.parser.Ast.IName; 
     8import org.axdt.as3.imp.parser.Ast.Ident; 
     9import org.axdt.axdoc.model.AXIndex; 
     10import org.axdt.axdoc.util.Index0r; 
    511import org.eclipse.imp.language.ILanguageService; 
    612import org.eclipse.imp.parser.IParseController; 
    713import org.eclipse.imp.parser.SimpleLPGParseController; 
    814import org.eclipse.imp.services.IReferenceResolver; 
    9  
    10 import org.axdt.as3.imp.parser.AS3Parser; 
    11 import org.axdt.as3.imp.parser.SymbolTable; 
    12 import org.axdt.as3.imp.parser.Ast.*; 
    1315 
    1416public class AS3ReferenceResolver implements IReferenceResolver, ILanguageService { 
     
    2224         */ 
    2325        public String getLinkText(Object node) { 
    24                 // TODO: Replace the call to super.getLinkText(..) with an 
    25                 // implementation suitable to you language and link types 
    26                 return node.toString(); 
     26                String linkText = node.toString(); 
     27                return linkText; 
    2728        } 
    2829 
     
    3233         */ 
    3334        public Object getLinkTarget(Object node, IParseController controller) { 
    34                 // START_HERE 
    35                 // Replace the given implementation with an implementation 
    36                 // that is suitable to you language and link types 
    37                 // NOTE: The code shown in this method body works with the 
    38                 // example grammar used in the SAFARI language-service templates. 
    39                 // It may be adaptable for use with other languages. HOWEVER, 
    40                 // this particular code is not essential to reference resolvers 
    41                 // in general, and the user should provide an implementation 
    42                 // that is appropriate to the language and AST structure for 
    43                 // which the service is being defined. 
    4435                Object currentAst = controller.getCurrentAst(); 
    45                 if (currentAst != null && node instanceof Ident) { 
     36                if (currentAst == null) return null; 
     37                // every link is based on an ident for now 
     38                if (node instanceof Ident) { 
    4639                        Ident id = (Ident) node; 
    47                         AS3Parser parser = (AS3Parser) ((SimpleLPGParseController) controller).getParser(); 
    48                         SymbolTable symtab = parser.getEnclosingSymbolTable(id); 
    49                         if (id.getDeclaration() != null) { 
    50                                 return id.getDeclaration(); 
     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]; 
     51                                } 
    5152                        } 
    52                         IAst declaration = symtab.findDeclaration(id.toString()); 
    53                         if (declaration != null) { 
    54                                 id.setDeclaration(declaration); 
    55                                 return declaration; 
     53                        // find local declaration 
     54                        decl = lookInSymbolTable(controller,(IAst) node,stringId); 
     55                        if (decl != null) { 
     56                                id.setDeclaration(decl); 
     57                                return decl; 
    5658                        } 
     59                        System.err.println(stringId); 
    5760                } 
    5861                return null; 
    5962        } 
     63 
     64        private Object lookInSymbolTable(IParseController controller, IAst node, String stringId) { 
     65                AS3Parser parser = (AS3Parser) ((SimpleLPGParseController) controller).getParser(); 
     66                SymbolTable symtab = parser.getEnclosingSymbolTable(node); 
     67                return symtab.findDeclaration(stringId); 
     68        } 
     69         
    6070} 
  • org.axdt.as3/src/org/axdt/as3/preferences/AS3Preferences.java

    rfc56e42 r87f02d1  
    44import org.axdt.preferences.AbstractPreferences; 
    55import org.eclipse.core.resources.IContainer; 
     6import org.eclipse.core.resources.IFolder; 
    67import org.eclipse.core.resources.IResource; 
    78import org.eclipse.jface.preference.IPreferenceStore; 
     
    7273                String sourcePaths = store.getString(AS3Preferences.SOURCE_PATHS); 
    7374                String[] split = sourcePaths.split("[,; ]"); 
    74                 IContainer[] paths = new IContainer[split.length]; 
     75                IFolder[] paths = new IFolder[split.length]; 
    7576                for (int i = 0; i < split.length; i++) { 
    7677                        paths[i] = res.getProject().getFolder(split[i]); 
     78// TODO implement when imp model is done 
     79//                      try { 
     80//                              ModelFactory.create(paths[i]); 
     81//                      } catch (ModelException e) { 
     82//                              AS3Plugin.getDefault().log("error creating source folder",e); 
     83//                      } 
    7784                } 
    7885                return paths; 
     
    8289                if (res == null || res.getProject() == null) 
    8390                        throw new IllegalArgumentException("A project resource must be specified"); 
    84                 return res.getProject().getFolder(getDeployPathString(res)); 
     91                IFolder folder = res.getProject().getFolder(getDeployPathString(res)); 
     92// TODO implement when imp model is done 
     93//              try { 
     94//                      ModelFactory.create(folder); 
     95//              } catch (ModelException e) { 
     96//                      AS3Plugin.getDefault().log("error creating source folder",e); 
     97//              } 
     98                return folder; 
    8599        } 
    86100 
  • org.axdt.as3/src/org/axdt/as3/templates/AS3TemplateCompletionProcessor.java

    rc6b669e r87f02d1  
    6565                return (ICompletionProposal[]) matches.toArray(new ICompletionProposal[matches.size()]); 
    6666        } 
    67  
     67         
    6868        public List<TemplateProposal> computeCompletionProposalList(ITextViewer viewer, int offset) { 
     69                return computeCompletionProposalList(viewer, offset, null); 
     70        } 
     71         
     72        public List<TemplateProposal> computeCompletionProposalList( 
     73                        ITextViewer viewer, int offset, String prefix) { 
    6974                ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection(); 
    7075 
     
    7378                        offset = selection.getOffset() + selection.getLength(); 
    7479 
    75                 String prefix = extractPrefix(viewer, offset); 
     80                if (prefix == null) { 
     81                        prefix = extractPrefix(viewer, offset); 
     82                } 
    7683                Region region = new Region(offset - prefix.length(), prefix.length()); 
    7784                TemplateContext context = createContext(viewer, region); 
  • org.axdt.axdoc.model/.classpath

    r79dd699 r87f02d1  
    22<classpath> 
    33        <classpathentry kind="src" path="src"/> 
    4         <classpathentry exported="true" kind="lib" path="tagsoup-1.2.jar"/> 
    54        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> 
    65        <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> 
  • org.axdt.axdoc.model/META-INF/MANIFEST.MF

    r79dd699 r87f02d1  
    44Bundle-SymbolicName: org.axdt.axdoc.model;singleton:=true 
    55Bundle-Version: 0.0.6.0 
    6 Bundle-ClassPath: ., 
    7  tagsoup-1.2.jar 
     6Bundle-ClassPath: . 
    87Bundle-Vendor: %providerName 
    98Bundle-Localization: plugin 
     
    1312 org.eclipse.emf.ecore.xmi 
    1413Bundle-ActivationPolicy: lazy 
    15 Export-Package: org.axdt.axdoc, 
     14Export-Package:  
    1615 org.axdt.axdoc.model, 
    1716 org.axdt.axdoc.model.util 
  • org.axdt.axdoc.model/build.properties

    r79dd699 r87f02d1  
    99               META-INF/,\ 
    1010               plugin.xml,\ 
    11                plugin.properties,\ 
    12                tagsoup-1.2.jar 
     11               plugin.properties 
    1312jars.compile.order = . 
    1413source.. = src/ 
  • org.axdt.axdoc.model/model/AXDoc.ecore

    r79dd699 r87f02d1  
    4343      <eParameters name="part" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> 
    4444    </eOperations> 
     45    <eOperations name="getOrCreatePackage" eType="#//AXPackage"/> 
    4546    <eStructuralFeatures xsi:type="ecore:EReference" name="reference" eType="#//AXPackage"/> 
    4647    <eStructuralFeatures xsi:type="ecore:EAttribute" name="level" eType="#//AXLevel" 
  • org.axdt.axdoc.model/model/AXDocXML.xsd

    r79dd699 r87f02d1  
    1 <?xml version="1.0" encoding="UTF-8"?> 
     1<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    22<xsd:schema xmlns:axdoc="http://axdt.org/axdoc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://axdt.org/axdoc"> 
    33  <xsd:simpleType name="AXLevel"> 
  • org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXIndex.java

    r79dd699 r87f02d1  
    147147        AXIndex createIndex(String part); 
    148148 
     149        /** 
     150         * <!-- begin-user-doc --> 
     151         * <!-- end-user-doc --> 
     152         * @model kind="operation" 
     153         * @generated 
     154         */ 
     155        AXPackage getOrCreatePackage(); 
     156 
    149157} // AXIndex 
  • org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXDocPackageImpl.java

    r79dd699 r87f02d1  
    713713                                IS_ORDERED); 
    714714 
     715                addEOperation(axIndexEClass, this.getAXPackage(), "getOrCreatePackage", 
     716                                0, 1, IS_UNIQUE, IS_ORDERED); 
     717 
    715718                initEClass(axRootEClass, AXRoot.class, "AXRoot", !IS_ABSTRACT, 
    716719                                !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); 
  • org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXIndexImpl.java

    r79dd699 r87f02d1  
    1717import org.axdt.axdoc.model.AXPackage; 
    1818import org.axdt.axdoc.model.AXRoot; 
     19import org.axdt.axdoc.model.util.AXUtil; 
    1920import org.eclipse.emf.common.notify.Notification; 
    2021import org.eclipse.emf.common.notify.NotificationChain; 
    2122import org.eclipse.emf.common.util.EList; 
     23import org.eclipse.emf.common.util.URI; 
    2224import org.eclipse.emf.ecore.EClass; 
    2325import org.eclipse.emf.ecore.InternalEObject; 
     
    506508                return getParent(); 
    507509        } 
     510 
     511        /** 
     512         * <!-- begin-user-doc --> 
     513         * <!-- end-user-doc --> 
     514         */ 
     515        public AXPackage getOrCreatePackage() { 
     516                AXPackage pack = getReference(); 
     517                if (pack == null) { 
     518                        pack = AXDocFactory.eINSTANCE.createAXPackage(); 
     519                        pack.setName(getName()); 
     520                        URI uri = eResource().getURI().trimSegments(1).appendSegment( 
     521                                        getId() + ".axdoc"); 
     522                        AXUtil.getResource(eResource().getResourceSet(), pack, uri 
     523                                        .toString()); 
     524                        setReference(pack); 
     525                } 
     526                return pack; 
     527        } 
    508528} //AXIndexImpl 
  • org.axdt.axdoc.model/src/org/axdt/axdoc/model/util/AXUtil.java

    r79dd699 r87f02d1  
    6262                ResourceSet set = rootNode.eResource().getResourceSet(); 
    6363                for (Resource res : set.getResources()) { 
    64                         res.setURI(URI.createURI(path+res.getURI().lastSegment())); 
    6564                        res.save(null); 
    6665                } 
     
    6968                return createRoot(null, url, basePath); 
    7069        } 
    71         public static AXRoot createRoot(String name, String url, String basePath) { 
     70        public static AXRoot createRoot(String name, String url, String resourceUrl) { 
    7271                AXRoot root = factory.createAXRoot(); 
    7372                root.setName(name); 
    7473                root.setUrl(url); 
    7574                ResourceSet set = xmlProcessor.createResourceSet(); 
    76                 getResource(set, root, basePath.concat("root-index.axdoc.xml")); 
     75                getResource(set, root, resourceUrl); 
    7776                return root; 
    7877        } 
  • org.axdt.axdoc.test/.settings/org.eclipse.jdt.core.prefs

    r9a9ef10 r87f02d1  
    1 #Tue May 12 03:20:09 CEST 2009 
     1#Fri May 29 00:33:29 CEST 2009 
    22eclipse.preferences.version=1 
    33org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 
  • org.axdt.axdoc.test/META-INF/MANIFEST.MF

    r79dd699 r87f02d1  
    11Manifest-Version: 1.0 
    22Bundle-ManifestVersion: 2 
    3 Bundle-Name: Test Fragment 
     3Bundle-Name: %pluginName 
    44Bundle-SymbolicName: org.axdt.axdoc.test 
    55Bundle-Version: 0.0.6.0 
    6 Bundle-Vendor: http://axdt.org 
    7 Fragment-Host: org.axdt.axdoc.model 
     6Bundle-Vendor: %providerName 
    87Bundle-RequiredExecutionEnvironment: J2SE-1.5 
    9 Require-Bundle: org.junit 
     8Require-Bundle: org.axdt.axdoc, 
     9 org.axdt.axdoc.model, 
     10 org.junit 
  • org.axdt.axdoc.test/plugin.properties

    r9a9ef10 r87f02d1  
    55 
    66pluginName = AXDoc Tests 
    7 providerName = www.example.org 
     7providerName = http://axdt.org 
  • org.axdt.axdoc.test/src/org/axdt/axdoc/AXDocAllTest.java

    r79dd699 r87f02d1  
    1111import junit.textui.TestRunner; 
    1212 
    13 import org.axdt.axdoc.model.AXDocTests; 
    1413import org.axdt.axdoc.model.coffeetime.ASDocFormatTest; 
    1514 
  • org.axdt.axdoc.test/src/org/axdt/axdoc/AXDocRegularTest.java

    r79dd699 r87f02d1  
    1414import org.axdt.axdoc.model.util.AXDocParserTest; 
    1515import org.axdt.axdoc.model.util.AXDocUtilTest; 
     16import org.axdt.axdoc.util.Index0rTest; 
    1617 
    1718/** 
     
    3233                suite.addTestSuite(AXDocParserTest.class); 
    3334                suite.addTestSuite(AXDocUtilTest.class); 
     35                suite.addTestSuite(Index0rTest.class); 
    3436                return suite; 
    3537        } 
  • org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXIndexTest.java

    r79dd699 r87f02d1  
    1818 *   <li>{@link org.axdt.axdoc.model.AXIndex#localIndex(java.lang.String) <em>Local Index</em>}</li> 
    1919 *   <li>{@link org.axdt.axdoc.model.AXIndex#createIndex(java.lang.String) <em>Create Index</em>}</li> 
     20 *   <li>{@link org.axdt.axdoc.model.AXIndex#getOrCreatePackage() <em>Get Or Create Package</em>}</li> 
    2021 * </ul> 
    2122 * </p> 
     
    181182                assertSame(index, getFixture().createIndex("test")); 
    182183        } 
     184 
     185        /** 
     186         * Tests the '{@link org.axdt.axdoc.model.AXIndex#getOrCreatePackage() <em>Get Or Create Package</em>}' operation. 
     187         * <!-- begin-user-doc --> 
     188         * <!-- end-user-doc --> 
     189         * @see org.axdt.axdoc.model.AXIndex#getOrCreatePackage() 
     190         */ 
     191        public void testGetOrCreatePackage() { 
     192        } 
    183193} //AXIndexTest 
  • org.axdt.axdoc.test/src/org/axdt/axdoc/model/coffeetime/ASDocFormatTest.java

    r79dd699 r87f02d1  
    1212import org.axdt.axdoc.model.AXLevel; 
    1313import org.axdt.axdoc.model.AXRoot; 
    14 import org.axdt.axdoc.model.util.AXDocParser; 
    1514import org.axdt.axdoc.model.util.AXUtil; 
    16 import org.axdt.axdoc.model.util.HtmlLoader; 
     15import org.axdt.axdoc.util.AXDocParser; 
     16import org.axdt.axdoc.util.HtmlLoader; 
    1717import org.w3c.dom.Node; 
    1818 
  • org.axdt.axdoc.test/src/org/axdt/axdoc/model/util/AXDocParserTest.java

    r79dd699 r87f02d1  
    77import org.axdt.axdoc.model.AXLevel; 
    88import org.axdt.axdoc.model.AXRoot; 
    9 import org.axdt.axdoc.model.util.AXDocParser; 
     9import org.axdt.axdoc.util.AXDocParser; 
    1010 
    1111public class AXDocParserTest extends TestCase implements TestConstants { 
  • org.axdt.axdoc/src/org/axdt/axdoc/util/AXDocParser.java

    r79dd699 r87f02d1  
    1 package org.axdt.axdoc.model.util; 
     1package org.axdt.axdoc.util; 
    22 
    33import java.io.FileNotFoundException; 
     
    99import javax.xml.xpath.XPathExpressionException; 
    1010 
    11 import org.axdt.axdoc.model.AXDocFactory; 
    1211import org.axdt.axdoc.model.AXEntry; 
    1312import org.axdt.axdoc.model.AXEntryType; 
    1413import org.axdt.axdoc.model.AXIndex; 
    1514import org.axdt.axdoc.model.AXLevel; 
    16 import org.axdt.axdoc.model.AXNode; 
    1715import org.axdt.axdoc.model.AXPackage; 
    1816import org.axdt.axdoc.model.AXRoot; 
    1917import org.axdt.axdoc.model.AXType; 
     18import org.axdt.axdoc.model.util.AXUtil; 
    2019import org.w3c.dom.DOMException; 
    2120import org.w3c.dom.Node; 
     
    113112                                log(2,"[DD] found ", packageIndex); 
    114113                                if (loadSummary) { 
    115                                         AXPackage packageNode = AXDocFactory.eINSTANCE.createAXPackage(); 
    116                                         setDoc(packageNode, item.getParentNode().getNextSibling()); 
    117                                         packageIndex.setReference(packageNode); 
     114                                        setDoc(packageIndex, item.getParentNode().getNextSibling()); 
    118115                                } 
    119116                        } else log(1,"[W] unknown link "+ loader.attr(item, "href") +" "+item.getTextContent()); 
     
    121118                root.setLevel(AXLevel.PACKAGE); 
    122119        } 
    123         public void setDoc(AXNode node, Node docNode) { 
     120        public void setDoc(AXIndex packageIndex, Node docNode) { 
    124121                if (docNode == null || docNode.getTextContent() == null) return; 
    125122                String docContent = docNode.getTextContent().replaceAll("\\W+"," ").trim(); 
    126123                if (docContent.trim().equals("")) return; 
    127                 node.getAsdoc().add(docContent);  
     124                packageIndex.getOrCreatePackage().getAsdoc().add(docContent);  
    128125        } 
    129126        public void parseTypeLevel(AXIndex index) { 
     
    171168                log(2,"[II] Parsing types in ", index); 
    172169                try { 
    173                         AXPackage reference = (AXPackage) index.getReference(); 
    174170                        Node html = loader.load(fullUrl); 
    175171                        if (loadSummary) { 
    176                                 if (reference == null) { 
    177                                         reference = AXDocFactory.eINSTANCE.createAXPackage(); 
    178                                         AXUtil.getResource(index.eResource().getResourceSet(), reference, index.getId()+".axdoc"); 
    179                                         reference.setName(index.getName()); 
    180                                         index.setReference(reference); 
    181                                 } 
    182172                                Node mainDoc = loader.eval(findMainDoc, html); 
    183                                 setDoc(reference, mainDoc); 
     173                                setDoc(index, mainDoc); 
    184174                        } 
    185175                        for (Node item:loader.eIter(findLinks, html)) { 
     
    222212                                                // remember package detail is ia/a/i 
    223213                                                Node parent = typeNode.isInterface() ? item.getParentNode() : item; 
    224                                                 setDoc(typeNode, parent.getParentNode().getNextSibling()); 
     214                                                //setDoc(typeNode, parent.getParentNode().getNextSibling()); 
    225215                                        } 
    226216                                        ((AXPackage)index.getReference()).getTypes().add(typeNode); 
  • org.axdt.axdoc/src/org/axdt/axdoc/util/HtmlLoader.java

    r79dd699 r87f02d1  
    1 package org.axdt.axdoc.model.util; 
     1package org.axdt.axdoc.util; 
    22 
    33import java.io.IOException; 
  • org.axdt.common/src/org/axdt/common/AxdtPlugin.java

    r79b60b9 r87f02d1  
    33import java.net.URL; 
    44 
     5import org.axdt.common.preferences.AxdtPreferences; 
    56import org.eclipse.core.runtime.FileLocator; 
    67import org.eclipse.core.runtime.Path; 
  • org.axdt.common/src/org/axdt/common/preferences/AxdtPreferences.java

    r4efac89 r87f02d1  
    66public class AxdtPreferences extends AbstractPreferences { 
    77 
     8        public static final String SHOW_DEBUG_INFO = "SHOW_DEBUG_INFO"; 
    89        private static AxdtPreferences instance; 
    910 
     
    2526        @Override 
    2627        public void initializeFieldSpecs() { 
    27                 // no global preference yet 
     28                add(SHOW_DEBUG_INFO, "Show &debug info in the 'Error Log' view.", false); 
     29        } 
     30        public static boolean doDebug() { 
     31                return getInstance().getStore().getBoolean(SHOW_DEBUG_INFO); 
    2832        } 
    2933}