SlideShare una empresa de Scribd logo
1 de 52
Descargar para leer sin conexión
JDT fundamentals – Become a JDT tool smith

                    Deepak Azad
                                   IBM Bangalore lab, India
                                   deepak.azad@in.ibm.com

                    Olivier Thomann
                                   IBM Ottawa lab, Canada
                                   olivier_thomann@ca.ibm.com




Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
                              Confidential | Date | Other Information, if necessary   Tutorial
                                                                                       © 2002 IBM Corporation
Outline
     A guided tour through services offered by JDT Core and JDT UI
           Java Model TM




           Search Engine and Type Hierarchy
           Abstract Syntax Tree (DOM/AST)
           Batch compiler




          Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
2
Target Audience
     Plug-in implementers that want to use the Java infrastructure
         Code metrics plug-ins
         Code audit plug-ins
         Refactorings / quick fixes
         Research, commercial or JDT open-source contributors


     Implementers of plug-ins for a new language
         Study JDT as an example on how to structure the core infrastructure
         Solve problems regarding memory usage and runtime performance



    General knowledge about the Eclipse plug-in architecture and in-depth
     knowledge of Java is expected.




         Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
3
Overview – The 3 Pillars

    Java Model – Lightweight model for views
         OK to keep references to it
         Contains unresolved information
         From projects to declarations (types, methods,...)

    Search Engine
         Indexes of declarations, references and type hierarchy relationships

    AST – Fine-grained, fully resolved compiler parse tree
         No references to it must be kept: Clients have to make sure only a limited
          number of ASTs is loaded at the same time
         Fully resolved information
         From a Java file (‘Compilation Unit’) to identifier tokens



        Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
4
The 3 Pillars – First Pillar: Java Model

         Java Model – Lightweight model for views
               Java model and its elements
               Classpath elements
               Java project settings
               Creating a Java element
               Change notification
               Type hierarchy
               Code resolve

         Search Engine

         AST – Precise, fully resolved compiler parse tree




            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
5
The Java Model - Design Motivation

        Requirements for an element to show in views:

           Lightweight: Quickly created, small memory footprint
                   Must scale and work for big workspaces (10’000 types and more). Cannot hold
                    on resources, Eclipse is not just a Java IDE
           Fault tolerant: Provide structure for files while editing
                   Some source does not (yet) compile, missing brackets, semicolons. Tooling
                    should be as helpful as possible
                   Views like the Outline want to show the structure while typing. Structure should
                    stay as stable as possible

        Chosen solution:

           Lazily populated model
           Quick creation: Single parse, no resolving, no dependency on build state
           Underlying buffer can be released and recreated any time




            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
6
IJavaElements form a hierarchy that represents the
   entire workspace from Java angle                                                            Java Elements API
 Different from resource hierarchy
Important to note:
 Not all Java elements must have an underlying resource
  (elements inside a JAR, external JAR files)
 A Java package doesn’t have the same children as a folder                                         IJavaProject
  (no concept of subfolder)
                                       JavaCore.create(resource)                                        IPackageFragmentRoot

                                                                                                             IPackageFragment
                                                                IType
                                                                                                             ICompilationUnit /
                                                                    IMethod                                  IClassFile

                                                                      IField                                       element.getParent()
IProject                                                            IInitialzier
IFolder
                                                                                                              element.getChildren()
IFile




                                     javaElement.getResource()

                 Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
  7
Java Element Handles
        Handle/Info design
             IJavaElement objects are lightweight: OK to keep references
             Underlying buffer (‘element info’) created on demand
             Element doesn’t need to exist or be on the build path (anymore). Use
              IJavaElement#exists() to test
             Handle representation stable between workspace sessions
                  String handleId= javaElement.getHandleIdentifier();
                  IJavaElement elem= JavaCore.create(handleId);




            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
8
Using the Java Model

      Setting up a Java project
            A Java project is a project with the Java nature set
            Java nature enables the Java builder
            Java builder needs a Java class path

      IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
      IProject project= root.getProject(projectName);
      project.create(null);
                                                                                           Create a project
      project.open(null);

      IProjectDescription description = project.getDescription();                          Set the
      description.setNatureIds(new String[] { JavaCore.NATURE_ID });                       Java
      project.setDescription(description, null);
                                                                                           nature
      IJavaProject javaProject= JavaCore.create(project);
      javaProject.setRawClasspath(classPath, defaultOutputLocation, null);

                                                                                            Set the Java
                                                                                            build path


             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
9
Java Classpath
        The Java element hierarchy is defined by the Java classpath:
        Classpath entries define the roots of package fragments.




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
10
Classpath – Source and Library Entries
         Source entry: Java source files to be built by the compiler
              Folder inside the project or the project itself
              Possibility to define inclusion and exclusion filters
              Compiled files go to either a specific or the projects default output location

           IPath srcPath= javaProject.getPath().append("src");
           IPath[] excluded= new IPath[] { new Path("doc") };
           IClasspathEntry srcEntry= JavaCore.newSourceEntry(srcPath, excluded);




        Library entry: Class folder or archive
              Class files in folder or JAR archive, in workspace or external
              Source attachment specifies location of library’s source




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
11
Java Classpath: Container Entries

         Container entry: Multiple entries through an indirection
                  Path denotes name and arguments for a ‘classpath container’
                 entry= JavaCore.newContainerEntry(new Path("containerId/
                 containerArguments"));
                  Classpath containers are contributed by extension point
                  Classpath containers can compute classpath entries when first used
                  Built-in containers: JRE, User library, JUnit, PDE dependencies
                 jreCPEntry= JavaCore.newContainerEntry(new Path(JavaRuntime.JRE_CONTAINER));


               Extension point ‘org.eclipse.jdt.core.classpathContainerInitializer’
                   Initializes and manages containers (using
                    JavaCore.setClasspathContainer(..))
               Extension point ‘org.eclipse.jdt.ui.classpathContainerPage’
                   Contributes a classpath container configuration page



              Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
12
Creating Java Elements
     IJavaProject javaProject= JavaCore.create(project);              Set the build path
     IClasspathEntry[] buildPath= {
        JavaCore.newSourceEntry(project.getFullPath().append("src")),
        JavaRuntime.getDefaultJREContainerEntry()
     };
     javaProject.setRawClasspath(buildPath, project.getFullPath().append("bin"),
     null);

     IFolder folder= project.getFolder("src");
                                                                                             Create the source folder
     folder.create(true, true, null);

     IPackageFragmentRoot srcFolder= javaProject.getPackageFragmentRoot(folder);
     Assert.assertTrue(srcFolder.exists()); // resource exists and is on build path
                                                                                         Create the package fragment
     IPackageFragment fragment= srcFolder.createPackageFragment("x.y", true, null);

     String str=                                             Create the compilation
       "package x.y;"             + "n" +                   unit, including a type
       "public class E {"         + "n" +
       " String first;"           + "n" +
       "}";
     ICompilationUnit cu= fragment.createCompilationUnit("E.java", str, false, null);

     IType type= cu.getType("E");                                                                      Create a field

     type.createField("String name;", null, true, null);
           Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
13
Java Project Settings
          Configure compiler settings on the project
                Compiler compliance, class file compatibility, source compatibility
                 (JavaCore.COMPILER_COMPLIANCE, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM,
                  JavaCore.COMPILER_SOURCE )

                Compiler problems severities (Ignore/Warning/Error)
          javaProject.setOption(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5);


          If not set on the project, taken from the workspace settings

                 Project settings persisted in project/.settings/org.eclipse.jdt.core.prefs
                 Used to share the settings in the team
                 More project specific settings: Formatter, code templates,…


          See Platform preferences story
                 Platform.getPreferencesService()


             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
14
Working Copies
           A compilation unit in a buffered state is a working copy
           Primary working copy: shared buffer shown by all editors
                based on the Eclipse Platform’s buffer manager (plug-in
                 org.eclipse.core.filebuffers)
                becomeWorkingCopy(...): Increment count, internally create buffer, if first
                commitWorkingCopy(): Apply buffer to underlying resource
                discardWorkingCopy(): Decrement count, discard buffer, if last
                Element stays the same, only state change
           Private working copy: Build a virtual Java model layered on top of the current
            content
                ICompilationUnit.getWorkingCopy(workingCopyOwner) returns a new element with
                 a new buffer (managed by the workingCopyOwner) based on the underlying
                 element
                commitWorkingCopy(): Apply changes to the underlying element
                Refactoring uses this to first try all changes in a sandbox to only apply them if
                 compilable
           Working copy owner: Connects working copies so that they reference each
            other

             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
15
Java Element Change Notifications
        Change Listeners:                             JavaCore.addElementChangedListener
                                                      (IElementChangedListener)
               Java element delta information for all changes: Class path changes,
                added/removed elements, changed source, change to buffered state
                (working copy)
               Changes triggered by resource change notifications (resource deltas),
                call to ‘reconcile()’
               Java element deltas do not contain the old state (not a diff)
               The granularity ends at the member level (no AST)
            IJavaElementDelta: Description of changes of an element or its children
      Delta kind              Descriptions and additional flags
      ADDED                   Element has been added
      REMOVED                 Element has been removed
      CHANGED                 F_CONTENT                      Content has changed. If F_FINE_GRAINED is set: Analysis of
                                                             structural changed has been performed
                              F_MODIFIERS                    Changed modifiers
                              F_CHILDREN                     Deltas in children IJavaElementDelta[] getAffectedChildren()


                              F_ADDED_TO_CLASSPATH, F_SOURCEATTACHED, F_REORDER,
                              F_PRIMARY_WORKING_COPY,…
                Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
16
JavaElementListener – an Example
     Find out if types were added or removed
     fJavaListener= new IElementChangedListener() {
         public void elementChanged(ElementChangedEvent event) {                                    Parent constructs:
           boolean res= hasTypeAddedOrRemoved(event.getDelta());                                    Recursively go
         }
                                                                                                    down the delta
         private boolean hasTypeAddedOrRemoved(IJavaElementDelta delta) {                           tree
           IJavaElement elem= delta.getElement();
           boolean isAddedOrRemoved= (delta.getKind() != IJavaElementDelta.CHANGED);
           switch (elem.getElementType()) {
                  case IJavaElement.JAVA_MODEL: case IJavaElement.JAVA_PROJECT:
                  case IJavaElement.PACKAGE_FRAGMENT_ROOT: case IJavaElement.PACKAGE_FRAGMENT:
                    if (isAddedOrRemoved) return true;
                    return processChildrenDelta(delta.getAffectedChildren());
                  case IJavaElement.COMPILATION_UNIT:
                    ICompilationUnit cu= (ICompilationUnit) elem;                                         Be aware of
                    if (!cu.getPrimary().equals(cu))                                                      private
                      return false;
                    if (isAddedOrRemoved || isPossibleStructuralChange(delta.getFlags()))                 working
                      return true;                                                                        copies
                    return processChildrenDelta(delta.getAffectedChildren());
                  case IJavaElement.TYPE:
                    if (isAddedOrRemoved) return true;
                    return processChildrenDelta(delta.getAffectedChildren()); // inner types
                  default: // fields, methods, imports...
                    return false;
              }
          }
     }
                      Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
17
JavaElementListener – cont’d
     private static boolean isPossibleStructuralChange(int flags) {
       return hasSet(flags, IJavaElementDelta.F_CONTENT)
              && !hasSet(flags , IJavaElementDelta.F_FINE_GRAINED));
     }
     private boolean processChildrenDelta(IJavaElementDelta[] children) {
       for (int i= 0; i < children.length; i++) {
         if (hasTypeAddedOrRemoved(children[i]))
           return true;                                           ‘Fine Grained’ set means that
       }
       return false;                                              children deltas have been
     }                                                            computed. If not, it is a
                                                                                              unknown change (potentially
                                Visit delta children recursively                              full change)




                Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
18
Type Hierarchy - Design Motivation

          Subtype hierarchies are expensive to create and maintain.

          Why not having an API IType.getSubtypes()?
           Bad performance for repeated queries in the same hierarchy

          Why not keep a constantly updated hierarchy in memory?
           Does not scale for big workspaces. JDT is not alone in the workbench and
            should avoid holding on to lots of memory.
           Expensive updating. Every class path change would require types to
            recheck if they still resolve to the same type


          Chosen solution:

              Explicit hierarchy object
                      Defined life cycle
                      Well known creation costs (sub type relationship is stored in index files)
                      Allows scoped hierarchies

              Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
19
Type Hierarchy

            Snapshot of ITypes in a sub/super type relationship
            Used in Type Hierarchy view




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
20
Type Hierarchy
     Create – on a type or on a region (= set of Java Elements)
            typeHierarchy= type.newTypeHierarchy(progressMonitor);
            typeHierarchy= project.newTypeHierarchy(region, progressMonitor);


     Supertype hierarchy – faster!
            typeHierarchy= type.newSupertypeHierarchy(progressMonitor);


     Get super and subtypes, interfaces and classes
           typeHierarchy.getSubtypes(type)


     Change listener – when changed, refresh is required
           typeHierarchy.addTypeHierarchyChangedListener(..);

           typeHierarchy.refresh(progressMonitor);




         Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
21
Code Resolve

            Resolve the element at the given offset and length in the source
                javaElements= compilationUnit.codeSelect(50, 10);

            Used for Navigate > Open (F3) and tool tips




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
22
Code Resolve – an Example
                                                                                            Set up a
                                                                                            compilation
      Resolving the reference to “String” in a compilation unit
                                                                                            unit
       String content =
         "public class X {" + "n" +
         " String field;"    + "n" +
         "}";
       ICompilationUnit cu=
         fragment.createCompilationUnit(“X.java", content, false, null);


       int start = content.indexOf("String");
       int length = "String".length();
       IJavaElement[] declarations = cu.codeSelect(start, length);



               Contains a single IType:
                  ‘java.lang.String’



              Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
23
More Java Model Features

         Navigation – resolve a name
             IType type= javaProject.findType("java.util.Vector");


         Context – resolve an enclosing element
             element= compilationUnit.getElementAt(position);

         Code assist – evaluate completions for a given offset
            compilationUnit.codeComplete(offset, resultRequestor);


         Code formatting
             ToolFactory.createCodeFormatter(options)
                .format(kind, string, offset, length, indentationLevel, lineSeparator);




            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
24
API in JDT UI
         Labels, images, structure, order for IJavaElements:
              JavaElementLabelProvider
              StandardJavaElementContentProvider
              JavaElementComparator


         Selection and configuration dialogs, wizards
              JavaUI.createPackageDialog(..), JavaUI.createTypeDialog(..)
              BuildPathDialogAccess
              NewClassWizardPage, NewInterfaceWizardPage…
              JavadocExportWizardPage, NewJavaProjectWizardPageOne / Two


         Java Actions to add to context menus
              package org.eclipse.jdt.ui.actions
              New in 3.6: org.eclipse.jdt.ui.actions.OpenAttachedJavadocAction

             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
25
Second Pillar: Search Engine

         Java Model – Lightweight model for views

         Search Engine
              Design motivation
              Using the search engine
              Code example

         AST – Precise, fully resolved compiler parse tree




            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
26
Search Engine – Design Motivation
     Need quick access to all references or declarations of a Java element
          Searching for all references to type “A”
          Used to build call graphs
          All types in workspace

     Trade-off between search and update performance

     Chosen solution:
          Index based search engine
          Index is “word” based. It doesn’t contain resolved information (e.g. class U
           references method foo(), not method A#foo()).
          Special resolve step needed to narrow down matches reported from index
           (e.g. searching for B#foo() must not report U).




          Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
27
Search Engine
         Search for declarations and references
              packages, types, fields, methods and constructors
              using wildcards (including camel-case) or from a Java element
         Scoped search
              region = set of Java elements
              predefined workspace and hierarchy scopes
         Potential matches
              Code with errors, incomplete class paths
         Limit the match locations
              in casts, in catch clauses, only return types…




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
28
Search Engine – Using the APIs
        Creating a search pattern
          SearchPattern.createPattern("foo*",
              IJavaSearchConstants.FIELD, IJavaSearchConstants.REFERENCES,
              SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);

        Creating a search scope
           SearchEngine.createWorkspaceScope();
           SearchEngine.createJavaSearchScope(new IJavaElement[] { project });
           SearchEngine.createHierarchyScope(type);
           SearchEngine.createStrictHierarchyScope(
                     project,
                     type,
                     onlySubtypes,
                     includeFocusType,
                     progressMonitor);




        Collecting results
             Subclass SearchRequestor
             Each result reported as a SearchMatch


               Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
29
Search Engine – an Example
     Searching for all declarations of methods “foo” that return an int                       Search
                                                                                              pattern
     SearchPattern pattern = SearchPattern.createPattern(
       "foo(*) int",
       IJavaSearchConstants.METHOD,
       IJavaSearchConstants.DECLARATIONS,
       SearchPattern.R_PATTERN_MATCH);
                                                                                                 Search scope
     IJavaSearchScope scope = SearchEngine.createWorkspaceScope();

     SearchRequestor requestor = new SearchRequestor() {
       public void acceptSearchMatch(SearchMatch match) {
         System.out.println(match.getElement());
                                                                                                 Result
       }
                                                                                                 collector
     };

     SearchEngine searchEngine = new SearchEngine();             Start search
     searchEngine.search(
       pattern,
       new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant()},
       scope,
       requestor,
       null /*progress monitor*/);
                Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
30
The 3 Pillars – Third Pillar: AST

          Java Model – Lightweight model for views

          Search Engine

          AST – Precise, fully resolved compiler parse tree
               Overall design
               Creating an AST
               AST node details
               Bindings
               AST rewrite
               Refactoring toolkit




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
31
Abstract Syntax Tree - Design Motivation

        Java Model and type hierarchy are optimized to present model elements in a view.

        Refactorings and code manipulation features need fully resolved information down
          to statement level to perform exact code analysis.

        Need a way to manipulate source code on a higher abstraction than characters.


        Chosen solution:

         On-demand created abstract syntax tree with all resolved bindings
                Defined life cycle
                Well known creation costs


         Abstract syntax tree rewriter to manipulate code on language element level




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
32
Abstract Syntax Tree
          Source Code

                                                                            ASTParser#createAST(...)




         AST
                                                                                         ReturnStatement


                                                                                                expression

                                                                                         InfixExpression

                                                                        leftOperand                        rightOperand


                                        resolveBinding                   MethodInvocation                   SimpleName
          IMethodBinding




           Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
33
Abstract Syntax Tree cond’t
     A Java type for each syntactic construct
          Assignment, CastExpression, ConditionalExpression…

     Bindings for type information
          Can resolve all references through bindings

     Visitors and node properties for analysis




     ASTRewriter to manipulate an AST




            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
34
Creating an AST
          Build AST with AST factory: ASTParser
             Either from Java model elements: ICompilationUnit, IClassFile (ITypeRoot)
             Or source string, file name and IJavaProject as context


          Bindings or no bindings
             Bindings contain resolved information. Fully available on syntax-error-free code,
              best effort when there are errors.


          Full AST or partial AST
             For a given source position: All other methods have empty bodies
             AST for an element: Only method, statement or expression




              Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
35
Creating an AST
        Statements recovery
           No recovery: When detecting syntax error: Skip method body
           With recovery: Skip tokens, or introduce artificial tokens to create statements.
            Recovered node are flagged with ASTNode#RECOVERED

        Bindings recovery
           No recovery: No bindings if element can not be found (for example is not on the
            class path)
           With recovery: Introduce recovered bindings, only name is correct, no package or
            members. Bindings marked with binding.isRecovered()

        Create multiple ASTs using same binding environment, much faster

        setIgnoreMethodBodies(boolean): Can be used when the method bodies
         are not needed. This saves a lot of memory.

        New in 3.6, bindings can be resolved without an Eclipse workspace:
         ASTParser#setEnvironment(..)
             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
36
Creating an AST

       ASTParser parser= ASTParser.newParser(AST.JLS3);
       parser.setSource(cu);
       parser.setResolveBindings(true);                                                     Create AST on an
       parser.setStatementsRecovery(true);                                                  element
       ASTNode node= parser.createAST(null);




       ASTParser parser= ASTParser.newParser(AST.JLS3);
       parser.setSource("System.out.println();".toCharArray());
       parser.setProject(javaProject);
       parser.setKind(ASTParser.K_STATEMENTS);
       parser.setStatementsRecovery(false);                                                 Create AST on source
       ASTNode node= parser.createAST(null);                                                string




              Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
37
AST Browsing

     Typed access to the node children:
          ConditionalExpression:
                getExpression()
                getThenExpression()
                getElseExpression()


     Homogenous access using node
       properties:


        List allProperties= node.structuralPropertiesForType();
                                   Will contain 3 elements of type
                                   ‘StructuralPropertyDescriptor’:
                                   ConditionalExpression.EXPRESSION_PROPERTY,
                                   ConditionalExpression.THEN_EXPRESSION_PROPERTY,
                                   ConditionalExpression.ELSE_EXPRESSION_PROPERTY,
        expression=
            node.getStructuralProperty(ConditionalExpression.EXPRESSION_PROPERTY);

           Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
38
ASTView Demo




                           ASTView and JavaElement view:
                           http://www.eclipse.org/jdt/ui/update-site


          Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
39
AST View
     private void print(ASTNode node) {
         List properties= node.structuralPropertiesForType();
         for (Iterator iterator= properties.iterator(); iterator.hasNext();) {
             Object descriptor= iterator.next();
             if (descriptor instanceof SimplePropertyDescriptor) {
                 SimplePropertyDescriptor simple= (SimplePropertyDescriptor)descriptor;
                 Object value= node.getStructuralProperty(simple);
                 System.out.println(simple.getId() + " (" + value.toString() + ")");
             } else if (descriptor instanceof ChildPropertyDescriptor) {
                 ChildPropertyDescriptor child= (ChildPropertyDescriptor)descriptor;
                 ASTNode childNode= (ASTNode)node.getStructuralProperty(child);
                 if (childNode != null) {
                      System.out.println("Child (" + child.getId() + ") {");
                      print(childNode);
                      System.out.println("}");
                  }
             } else {
                  ChildListPropertyDescriptor list= (ChildListPropertyDescriptor)descriptor;
                  System.out.println("List (" + list.getId() + "){");
                  print((List)node.getStructuralProperty(list));
                  System.out.println("}");
             }
         }
     }
     private void print(List nodes) {
         for (Iterator iterator= nodes.iterator(); iterator.hasNext();) {
             ASTNode node= (ASTNode)iterator.next();
             print(node);
         }
     }
                Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
40
Bindings
     Bindings are fully connected
          ITypeBinding has bindings for super type, interfaces, all members
          IMethodBinding has bindings for parameter types, exceptions, return type
          IVariableBinding has binding for variable type

     Bindings retain a lot of memory:
          Do not hold on bindings
          Do not hold on ASTNodes that contain bindings

     Within an AST:
          Binding identity (can use ‘==‘ to compare bindings)


     Bindings from different ASTs:
          Compare binding.getKey()
          Or isEqualTo(…)

            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
41
Bindings cont’d
     From a binding to its declaring ASTNode:
          astRoot.findDeclaringNode(binding) (on CompilationUnit)


     From a binding to an IJavaElement:
          binding.getJavaElement()




           Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
42
AST Visitor
     ASTParser parser= ASTParser.newParser(AST.JLS3);
     parser.setSource(cu);
     parser.setResolveBindings(true);                                                       Count the number of
                                                                                            casts
     ASTNode root= parser.createAST(null);
     root.accept(new ASTVisitor() {

       public boolean visit(CastExpression node) {
         fCastCount++;
         return true;                                                                       Count the number of references
       }                                                                                    to a field of ‘java.lang.System’
                                                                                            (‘System.out’, ‘System.err’)

       public boolean visit(SimpleName node) {
         IBinding binding= node.resolveBinding();
         if (binding instanceof IVariableBinding) {
           IVariableBinding varBinding= (IVariableBinding) binding;
           ITypeBinding declaringType= varBinding.getDeclaringClass();
           if (varBinding.isField() &&
                    "java.lang.System".equals(declaringType.getQualifiedName())) {
              fAccessesToSystemFields++;
           }
         }
         return true;
       }


              Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
43
AST Rewriting
      Instead of manipulating the source code, change the AST and write
       changes back to source

      Descriptive approach
          describe changes without actually modifying the AST
          allows reuse of the AST for multiple independent rewrites
          support generation of a preview

      Modifying approach
          directly manipulates the AST
          API is more intuitive
          implemented using the descriptive rewriter

      Rewriter characteristics
          preserves user formatting and markers
          generates a TextEdit that describes document changes

          Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
44
AST Rewriting cont’d
         Implementation of descriptive rewrite is more powerful:

               String placeholders: Use a node that is a placeholder for an arbitrary string
                of code or comments
               Track node positions: Get the new source ranges after the rewrite
               Copy a range of nodes
               Modify the comment mapping heuristic used by the rewriter
                (comments are associated with nodes. Operation on nodes also include
                the associated comments)




            Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
45
AST Rewrite cont’d
     Example of the descriptive AST rewrite:
     public void modify(MethodDeclaration decl) {

         AST ast= decl.getAST();                                    Create the rewriter
         ASTRewrite astRewrite= ASTRewrite.create(ast);                                    Change the method
                                                                                           name
         SimpleName newName= ast.newSimpleName("newName");
         astRewrite.set(decl, MethodDeclaration.NAME_PROPERTY,                               newName, null);


         ListRewrite paramRewrite=
           astRewrite.getListRewrite(decl, MethodDeclaration.PARAMETERS_PROPERTY);

         SingleVariableDeclaration newParam= ast.newSingleVariableDeclaration();
         newParam.setType(ast.newPrimitiveType(PrimitiveType.INT));
         newParam.setName(ast.newSimpleName("p1"));

         paramRewrite.insertFirst(newParam, null);


         TextEdit edit= astRewrite.rewriteAST(document, null);
                                                                                                 Insert a new parameter
         edit.apply(document);                                                                   as first parameter
                                                           Create resulting edit script
     }
               Apply edit script to source buffer
             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
46
Code Manipulation Toolkits
      Refactoring – org.eclipse.ltk.refactoring
          refactorings - org.eclipse.ltk.core.refactoring.Refactoring
               responsible for precondition checking
               create code changes
          code changes - org.eclipse.ltk.core.refactoring.Change
               provide Undo/Redo support
               support non-textual changes (e.g. renaming a file)
               support textual changes based on text edit support
          user interface is wizard-based

      Quick Fix & Quick Assist – org.eclipse.jdt.ui.text.java
          processors - org.eclipse.jdt.ui.text.java.IQuickFixProcessor
               check availability based on problem identifier
               generate a list of fixes
          user interface is provided by editor

               Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
47
The Batch Compiler
     Java Model – Lightweight model for views

     Search Engine

     AST – Precise, fully resolved compiler parse tree
          Overall design
          Creating an AST
          AST node details
          Bindings
          AST rewrite
          Refactoring toolkit

     Batch Compiler




         Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
48
The Batch Compiler
         Eclipse provides and uses its own compiler that is not javac
                   The Eclipse compiler is used inside the IDE (Eclipse)
                   The Eclipse compiler can also be used as a pure batch compiler outside of Eclipse

         The Eclipse batch compiler can be used as:
                   A command line tool




                   A compiler adapter inside an Ant task:




                   As a compiler service used by the Compiler API (jsr 199)


                 Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
49
Summary
  JDT delivers powerful program manipulation services
       Java Model, Search engine and DOM AST
            Use them to add your own tool to the Eclipse Java IDE
       but also in headless mode (can be used programmatically)
            E.g. EMF, metrics tools, …
       Full J2SE 5.0/6.0 support
       Full-fledged batch compiler


  Community feedback is essential
       bug reports:          https://bugs.eclipse.org/bugs/enter_bug.cgi?product=JDT
       mailing lists:        http://www.eclipse.org/mail/index.html
       newsgroups: news://news.eclipse.org/eclipse.tools.jdt




              Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
50
Legal Notice
          Copyright © IBM Corp., 2007-2010. All rights reserved. This presentation and the
           source code in it are made available under the EPL, v1.0.
          Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in
           the United States, other countries, or both.
          Eclipse and the Eclipse logo are trademarks of Eclipse Foundation, Inc.
          IBM and the IBM logo are trademarks or registered trademarks of IBM
           Corporation, in the United States, other countries or both.
          Other company, product, or service names may be trademarks or service marks
           of others.
          THE INFORMATION DISCUSSED IN THIS PRESENTATION IS PROVIDED FOR
           INFORMATIONAL PURPOSES ONLY. WHILE EFFORTS WERE MADE TO
           VERIFY THE COMPLETENESS AND ACCURACY OF THE INFORMATION, IT IS
           PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
           IMPLIED, AND IBM SHALL NOT BE RESPONSIBLE FOR ANY DAMAGES
           ARISING OUT OF THE USE OF, OR OTHERWISE RELATED TO, SUCH
           INFORMATION. ANY INFORMATION CONCERNING IBM'S PRODUCT PLANS
           OR STRATEGY IS SUBJECT TO CHANGE BY IBM WITHOUT NOTICE




             Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
51
The JDT Team


      Daniel Megert                                                                   Frédéric Fusier

       Markus Keller


               Deepak Azad                      Ayushman Jain
                                                                                Jayaprakash Arthanareeswaran
     Raksha Vasisht
                                           Satyam Rama Kandula                             Srikanth Adayapalam




                 Olivier Thomann                                                              Michael Rennie
                                                                   Darin Wright

        Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0.
52

Más contenido relacionado

La actualidad más candente

Java programming material for beginners by Nithin, VVCE, Mysuru
Java programming material for beginners by Nithin, VVCE, MysuruJava programming material for beginners by Nithin, VVCE, Mysuru
Java programming material for beginners by Nithin, VVCE, MysuruNithin Kumar,VVCE, Mysuru
 
Core Java introduction | Basics | free course
Core Java introduction | Basics | free course Core Java introduction | Basics | free course
Core Java introduction | Basics | free course Kernel Training
 
Core Java Tutorials by Mahika Tutorials
Core Java Tutorials by Mahika TutorialsCore Java Tutorials by Mahika Tutorials
Core Java Tutorials by Mahika TutorialsMahika Tutorials
 
Top 10 Java Interview Questions and Answers 2014
Top 10 Java Interview Questions and Answers 2014 Top 10 Java Interview Questions and Answers 2014
Top 10 Java Interview Questions and Answers 2014 iimjobs and hirist
 
Eclipse Day India 2011 - Extending JDT
Eclipse Day India 2011 - Extending JDTEclipse Day India 2011 - Extending JDT
Eclipse Day India 2011 - Extending JDTdeepakazad
 
Java interview questions
Java interview questionsJava interview questions
Java interview questionsSoba Arjun
 
basic core java up to operator
basic core java up to operatorbasic core java up to operator
basic core java up to operatorkamal kotecha
 
Hibernate Interview Questions
Hibernate Interview QuestionsHibernate Interview Questions
Hibernate Interview QuestionsSyed Shahul
 
Elements of Java Language
Elements of Java Language Elements of Java Language
Elements of Java Language Hitesh-Java
 
Java Interview Questions
Java Interview QuestionsJava Interview Questions
Java Interview QuestionsKuntal Bhowmick
 

La actualidad más candente (18)

Java programming material for beginners by Nithin, VVCE, Mysuru
Java programming material for beginners by Nithin, VVCE, MysuruJava programming material for beginners by Nithin, VVCE, Mysuru
Java programming material for beginners by Nithin, VVCE, Mysuru
 
1_JavIntro
1_JavIntro1_JavIntro
1_JavIntro
 
Core Java introduction | Basics | free course
Core Java introduction | Basics | free course Core Java introduction | Basics | free course
Core Java introduction | Basics | free course
 
Introduction to JAVA
Introduction to JAVAIntroduction to JAVA
Introduction to JAVA
 
Core java
Core javaCore java
Core java
 
Java Annotations
Java AnnotationsJava Annotations
Java Annotations
 
Core Java Tutorials by Mahika Tutorials
Core Java Tutorials by Mahika TutorialsCore Java Tutorials by Mahika Tutorials
Core Java Tutorials by Mahika Tutorials
 
Core java1
Core java1Core java1
Core java1
 
Top 10 Java Interview Questions and Answers 2014
Top 10 Java Interview Questions and Answers 2014 Top 10 Java Interview Questions and Answers 2014
Top 10 Java Interview Questions and Answers 2014
 
Eclipse Day India 2011 - Extending JDT
Eclipse Day India 2011 - Extending JDTEclipse Day India 2011 - Extending JDT
Eclipse Day India 2011 - Extending JDT
 
Core java online training
Core java online trainingCore java online training
Core java online training
 
Java interview questions
Java interview questionsJava interview questions
Java interview questions
 
Core Java
Core JavaCore Java
Core Java
 
basic core java up to operator
basic core java up to operatorbasic core java up to operator
basic core java up to operator
 
Hibernate Interview Questions
Hibernate Interview QuestionsHibernate Interview Questions
Hibernate Interview Questions
 
Elements of Java Language
Elements of Java Language Elements of Java Language
Elements of Java Language
 
Java Interview Questions
Java Interview QuestionsJava Interview Questions
Java Interview Questions
 
Technical Interview
Technical InterviewTechnical Interview
Technical Interview
 

Destacado

Grafittis, Lenguaje Urbano
Grafittis, Lenguaje UrbanoGrafittis, Lenguaje Urbano
Grafittis, Lenguaje Urbanonico552
 
モジュール4
モジュール4モジュール4
モジュール4yukai314
 
Japan Ecotourism1
Japan Ecotourism1Japan Ecotourism1
Japan Ecotourism1yukai314
 
A classification and outline of cerebrovascular diseases ii 1975-stroke
A classification and outline of cerebrovascular diseases ii 1975-strokeA classification and outline of cerebrovascular diseases ii 1975-stroke
A classification and outline of cerebrovascular diseases ii 1975-strokeTiago Xavier
 
EclipseCon 2011 - What's new in JDT
EclipseCon 2011 - What's new in JDTEclipseCon 2011 - What's new in JDT
EclipseCon 2011 - What's new in JDTdeepakazad
 
Cambridgechildcarecenters
CambridgechildcarecentersCambridgechildcarecenters
Cambridgechildcarecentersd_mingdong
 
An Overview of Microfinance in Kenya
An Overview of Microfinance in KenyaAn Overview of Microfinance in Kenya
An Overview of Microfinance in Kenyahoang_agro
 

Destacado (7)

Grafittis, Lenguaje Urbano
Grafittis, Lenguaje UrbanoGrafittis, Lenguaje Urbano
Grafittis, Lenguaje Urbano
 
モジュール4
モジュール4モジュール4
モジュール4
 
Japan Ecotourism1
Japan Ecotourism1Japan Ecotourism1
Japan Ecotourism1
 
A classification and outline of cerebrovascular diseases ii 1975-stroke
A classification and outline of cerebrovascular diseases ii 1975-strokeA classification and outline of cerebrovascular diseases ii 1975-stroke
A classification and outline of cerebrovascular diseases ii 1975-stroke
 
EclipseCon 2011 - What's new in JDT
EclipseCon 2011 - What's new in JDTEclipseCon 2011 - What's new in JDT
EclipseCon 2011 - What's new in JDT
 
Cambridgechildcarecenters
CambridgechildcarecentersCambridgechildcarecenters
Cambridgechildcarecenters
 
An Overview of Microfinance in Kenya
An Overview of Microfinance in KenyaAn Overview of Microfinance in Kenya
An Overview of Microfinance in Kenya
 

Similar a EclipseCon 2010 - JDT Fundamentals

Qb it1301
Qb   it1301Qb   it1301
Qb it1301ArthyR3
 
Java Course 15: Ant, Scripting, Spring, Hibernate
Java Course 15: Ant, Scripting, Spring, HibernateJava Course 15: Ant, Scripting, Spring, Hibernate
Java Course 15: Ant, Scripting, Spring, HibernateAnton Keks
 
Core java introduction
Core java introductionCore java introduction
Core java introductionBeenu Gautam
 
Manuel - SPR - Intro to Java Language_2016
Manuel - SPR - Intro to Java Language_2016Manuel - SPR - Intro to Java Language_2016
Manuel - SPR - Intro to Java Language_2016Manuel Fomitescu
 
Batch Applications for the Java Platform
Batch Applications for the Java PlatformBatch Applications for the Java Platform
Batch Applications for the Java PlatformSivakumar Thyagarajan
 
Lec 4 06_aug [compatibility mode]
Lec 4 06_aug [compatibility mode]Lec 4 06_aug [compatibility mode]
Lec 4 06_aug [compatibility mode]Palak Sanghani
 
Java/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBCJava/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBCFAKHRUN NISHA
 
EJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLinkEJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLinkBill Lyons
 
Java Programming and J2ME: The Basics
Java Programming and J2ME: The BasicsJava Programming and J2ME: The Basics
Java Programming and J2ME: The Basicstosine
 
Building Large Java Projects Faster: Multicore javac and Makefile integration
Building Large Java Projects Faster: Multicore javac and Makefile integrationBuilding Large Java Projects Faster: Multicore javac and Makefile integration
Building Large Java Projects Faster: Multicore javac and Makefile integrationFredrik Öhrström
 
Advance java prasentation
Advance java prasentationAdvance java prasentation
Advance java prasentationdhananajay95
 
What Your Jvm Has Been Trying To Tell You
What Your Jvm Has Been Trying To Tell YouWhat Your Jvm Has Been Trying To Tell You
What Your Jvm Has Been Trying To Tell YouJohn Pape
 
Chapter1pp
Chapter1ppChapter1pp
Chapter1ppJ. C.
 
Con-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With JavassistCon-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With JavassistAnton Arhipov
 

Similar a EclipseCon 2010 - JDT Fundamentals (20)

Qb it1301
Qb   it1301Qb   it1301
Qb it1301
 
Introduction to java
Introduction to javaIntroduction to java
Introduction to java
 
Java Course 15: Ant, Scripting, Spring, Hibernate
Java Course 15: Ant, Scripting, Spring, HibernateJava Course 15: Ant, Scripting, Spring, Hibernate
Java Course 15: Ant, Scripting, Spring, Hibernate
 
Core java introduction
Core java introductionCore java introduction
Core java introduction
 
Manuel - SPR - Intro to Java Language_2016
Manuel - SPR - Intro to Java Language_2016Manuel - SPR - Intro to Java Language_2016
Manuel - SPR - Intro to Java Language_2016
 
Batch Applications for the Java Platform
Batch Applications for the Java PlatformBatch Applications for the Java Platform
Batch Applications for the Java Platform
 
Javaee6 Overview
Javaee6 OverviewJavaee6 Overview
Javaee6 Overview
 
Lec 4 06_aug [compatibility mode]
Lec 4 06_aug [compatibility mode]Lec 4 06_aug [compatibility mode]
Lec 4 06_aug [compatibility mode]
 
Java/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBCJava/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBC
 
EJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLinkEJB 3.0 Java Persistence with Oracle TopLink
EJB 3.0 Java Persistence with Oracle TopLink
 
Spring Basics
Spring BasicsSpring Basics
Spring Basics
 
Java Programming and J2ME: The Basics
Java Programming and J2ME: The BasicsJava Programming and J2ME: The Basics
Java Programming and J2ME: The Basics
 
Spring
SpringSpring
Spring
 
Spring
SpringSpring
Spring
 
Spring
SpringSpring
Spring
 
Building Large Java Projects Faster: Multicore javac and Makefile integration
Building Large Java Projects Faster: Multicore javac and Makefile integrationBuilding Large Java Projects Faster: Multicore javac and Makefile integration
Building Large Java Projects Faster: Multicore javac and Makefile integration
 
Advance java prasentation
Advance java prasentationAdvance java prasentation
Advance java prasentation
 
What Your Jvm Has Been Trying To Tell You
What Your Jvm Has Been Trying To Tell YouWhat Your Jvm Has Been Trying To Tell You
What Your Jvm Has Been Trying To Tell You
 
Chapter1pp
Chapter1ppChapter1pp
Chapter1pp
 
Con-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With JavassistCon-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With Javassist
 

Más de deepakazad

Recommending development environment commands
Recommending development environment commandsRecommending development environment commands
Recommending development environment commandsdeepakazad
 
Skynet is coming!
Skynet is coming!Skynet is coming!
Skynet is coming!deepakazad
 
Eclipse Demo Camp Bangalore 2009 - JSDT
Eclipse Demo Camp Bangalore 2009 - JSDTEclipse Demo Camp Bangalore 2009 - JSDT
Eclipse Demo Camp Bangalore 2009 - JSDTdeepakazad
 
Eclipse and Academia
Eclipse and AcademiaEclipse and Academia
Eclipse and Academiadeepakazad
 
Eclipse Demo Camp 2010 - EGit
Eclipse Demo Camp 2010 - EGitEclipse Demo Camp 2010 - EGit
Eclipse Demo Camp 2010 - EGitdeepakazad
 
EclipseCon 2010 - What's new in JDT
EclipseCon 2010 - What's new in JDTEclipseCon 2010 - What's new in JDT
EclipseCon 2010 - What's new in JDTdeepakazad
 
Eclipse Day India 2010 - UI Patterns in Eclipse
Eclipse Day India 2010 - UI Patterns in EclipseEclipse Day India 2010 - UI Patterns in Eclipse
Eclipse Day India 2010 - UI Patterns in Eclipsedeepakazad
 

Más de deepakazad (7)

Recommending development environment commands
Recommending development environment commandsRecommending development environment commands
Recommending development environment commands
 
Skynet is coming!
Skynet is coming!Skynet is coming!
Skynet is coming!
 
Eclipse Demo Camp Bangalore 2009 - JSDT
Eclipse Demo Camp Bangalore 2009 - JSDTEclipse Demo Camp Bangalore 2009 - JSDT
Eclipse Demo Camp Bangalore 2009 - JSDT
 
Eclipse and Academia
Eclipse and AcademiaEclipse and Academia
Eclipse and Academia
 
Eclipse Demo Camp 2010 - EGit
Eclipse Demo Camp 2010 - EGitEclipse Demo Camp 2010 - EGit
Eclipse Demo Camp 2010 - EGit
 
EclipseCon 2010 - What's new in JDT
EclipseCon 2010 - What's new in JDTEclipseCon 2010 - What's new in JDT
EclipseCon 2010 - What's new in JDT
 
Eclipse Day India 2010 - UI Patterns in Eclipse
Eclipse Day India 2010 - UI Patterns in EclipseEclipse Day India 2010 - UI Patterns in Eclipse
Eclipse Day India 2010 - UI Patterns in Eclipse
 

Último

Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.francesco barbera
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Will Schroeder
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncObject Automation
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
Things you didn't know you can use in your Salesforce
Things you didn't know you can use in your SalesforceThings you didn't know you can use in your Salesforce
Things you didn't know you can use in your SalesforceMartin Humpolec
 
OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureEric D. Schabell
 
Spring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdfSpring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdfAnna Loughnan Colquhoun
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServicePicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServiceRenan Moreira de Oliveira
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopBachir Benyammi
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfDaniel Santiago Silva Capera
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UbiTrack UK
 

Último (20)

Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
Apres-Cyber - The Data Dilemma: Bridging Offensive Operations and Machine Lea...
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
GenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation IncGenAI and AI GCC State of AI_Object Automation Inc
GenAI and AI GCC State of AI_Object Automation Inc
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
Things you didn't know you can use in your Salesforce
Things you didn't know you can use in your SalesforceThings you didn't know you can use in your Salesforce
Things you didn't know you can use in your Salesforce
 
OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability Adventure
 
Spring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdfSpring24-Release Overview - Wellingtion User Group-1.pdf
Spring24-Release Overview - Wellingtion User Group-1.pdf
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer ServicePicPay - GenAI Finance Assistant - ChatGPT for Customer Service
PicPay - GenAI Finance Assistant - ChatGPT for Customer Service
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 Workshop
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
 

EclipseCon 2010 - JDT Fundamentals

  • 1. JDT fundamentals – Become a JDT tool smith Deepak Azad IBM Bangalore lab, India deepak.azad@in.ibm.com Olivier Thomann IBM Ottawa lab, Canada olivier_thomann@ca.ibm.com Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. Confidential | Date | Other Information, if necessary Tutorial © 2002 IBM Corporation
  • 2. Outline  A guided tour through services offered by JDT Core and JDT UI  Java Model TM  Search Engine and Type Hierarchy  Abstract Syntax Tree (DOM/AST)  Batch compiler Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 2
  • 3. Target Audience  Plug-in implementers that want to use the Java infrastructure  Code metrics plug-ins  Code audit plug-ins  Refactorings / quick fixes  Research, commercial or JDT open-source contributors  Implementers of plug-ins for a new language  Study JDT as an example on how to structure the core infrastructure  Solve problems regarding memory usage and runtime performance General knowledge about the Eclipse plug-in architecture and in-depth knowledge of Java is expected. Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 3
  • 4. Overview – The 3 Pillars Java Model – Lightweight model for views  OK to keep references to it  Contains unresolved information  From projects to declarations (types, methods,...) Search Engine  Indexes of declarations, references and type hierarchy relationships AST – Fine-grained, fully resolved compiler parse tree  No references to it must be kept: Clients have to make sure only a limited number of ASTs is loaded at the same time  Fully resolved information  From a Java file (‘Compilation Unit’) to identifier tokens Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 4
  • 5. The 3 Pillars – First Pillar: Java Model Java Model – Lightweight model for views  Java model and its elements  Classpath elements  Java project settings  Creating a Java element  Change notification  Type hierarchy  Code resolve Search Engine AST – Precise, fully resolved compiler parse tree Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 5
  • 6. The Java Model - Design Motivation Requirements for an element to show in views:  Lightweight: Quickly created, small memory footprint  Must scale and work for big workspaces (10’000 types and more). Cannot hold on resources, Eclipse is not just a Java IDE  Fault tolerant: Provide structure for files while editing  Some source does not (yet) compile, missing brackets, semicolons. Tooling should be as helpful as possible  Views like the Outline want to show the structure while typing. Structure should stay as stable as possible Chosen solution:  Lazily populated model  Quick creation: Single parse, no resolving, no dependency on build state  Underlying buffer can be released and recreated any time Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 6
  • 7. IJavaElements form a hierarchy that represents the entire workspace from Java angle Java Elements API  Different from resource hierarchy Important to note:  Not all Java elements must have an underlying resource (elements inside a JAR, external JAR files)  A Java package doesn’t have the same children as a folder IJavaProject (no concept of subfolder) JavaCore.create(resource) IPackageFragmentRoot IPackageFragment IType ICompilationUnit / IMethod IClassFile IField element.getParent() IProject IInitialzier IFolder element.getChildren() IFile javaElement.getResource() Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 7
  • 8. Java Element Handles Handle/Info design  IJavaElement objects are lightweight: OK to keep references  Underlying buffer (‘element info’) created on demand  Element doesn’t need to exist or be on the build path (anymore). Use IJavaElement#exists() to test  Handle representation stable between workspace sessions String handleId= javaElement.getHandleIdentifier(); IJavaElement elem= JavaCore.create(handleId); Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 8
  • 9. Using the Java Model Setting up a Java project  A Java project is a project with the Java nature set  Java nature enables the Java builder  Java builder needs a Java class path IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); IProject project= root.getProject(projectName); project.create(null); Create a project project.open(null); IProjectDescription description = project.getDescription(); Set the description.setNatureIds(new String[] { JavaCore.NATURE_ID }); Java project.setDescription(description, null); nature IJavaProject javaProject= JavaCore.create(project); javaProject.setRawClasspath(classPath, defaultOutputLocation, null); Set the Java build path Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 9
  • 10. Java Classpath The Java element hierarchy is defined by the Java classpath: Classpath entries define the roots of package fragments. Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 10
  • 11. Classpath – Source and Library Entries Source entry: Java source files to be built by the compiler  Folder inside the project or the project itself  Possibility to define inclusion and exclusion filters  Compiled files go to either a specific or the projects default output location IPath srcPath= javaProject.getPath().append("src"); IPath[] excluded= new IPath[] { new Path("doc") }; IClasspathEntry srcEntry= JavaCore.newSourceEntry(srcPath, excluded); Library entry: Class folder or archive  Class files in folder or JAR archive, in workspace or external  Source attachment specifies location of library’s source Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 11
  • 12. Java Classpath: Container Entries Container entry: Multiple entries through an indirection  Path denotes name and arguments for a ‘classpath container’ entry= JavaCore.newContainerEntry(new Path("containerId/ containerArguments"));  Classpath containers are contributed by extension point  Classpath containers can compute classpath entries when first used  Built-in containers: JRE, User library, JUnit, PDE dependencies jreCPEntry= JavaCore.newContainerEntry(new Path(JavaRuntime.JRE_CONTAINER));  Extension point ‘org.eclipse.jdt.core.classpathContainerInitializer’  Initializes and manages containers (using JavaCore.setClasspathContainer(..))  Extension point ‘org.eclipse.jdt.ui.classpathContainerPage’  Contributes a classpath container configuration page Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 12
  • 13. Creating Java Elements IJavaProject javaProject= JavaCore.create(project); Set the build path IClasspathEntry[] buildPath= { JavaCore.newSourceEntry(project.getFullPath().append("src")), JavaRuntime.getDefaultJREContainerEntry() }; javaProject.setRawClasspath(buildPath, project.getFullPath().append("bin"), null); IFolder folder= project.getFolder("src"); Create the source folder folder.create(true, true, null); IPackageFragmentRoot srcFolder= javaProject.getPackageFragmentRoot(folder); Assert.assertTrue(srcFolder.exists()); // resource exists and is on build path Create the package fragment IPackageFragment fragment= srcFolder.createPackageFragment("x.y", true, null); String str= Create the compilation "package x.y;" + "n" + unit, including a type "public class E {" + "n" + " String first;" + "n" + "}"; ICompilationUnit cu= fragment.createCompilationUnit("E.java", str, false, null); IType type= cu.getType("E"); Create a field type.createField("String name;", null, true, null); Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 13
  • 14. Java Project Settings Configure compiler settings on the project  Compiler compliance, class file compatibility, source compatibility (JavaCore.COMPILER_COMPLIANCE, JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.COMPILER_SOURCE )  Compiler problems severities (Ignore/Warning/Error) javaProject.setOption(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5); If not set on the project, taken from the workspace settings  Project settings persisted in project/.settings/org.eclipse.jdt.core.prefs  Used to share the settings in the team  More project specific settings: Formatter, code templates,… See Platform preferences story  Platform.getPreferencesService() Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 14
  • 15. Working Copies  A compilation unit in a buffered state is a working copy  Primary working copy: shared buffer shown by all editors  based on the Eclipse Platform’s buffer manager (plug-in org.eclipse.core.filebuffers)  becomeWorkingCopy(...): Increment count, internally create buffer, if first  commitWorkingCopy(): Apply buffer to underlying resource  discardWorkingCopy(): Decrement count, discard buffer, if last  Element stays the same, only state change  Private working copy: Build a virtual Java model layered on top of the current content  ICompilationUnit.getWorkingCopy(workingCopyOwner) returns a new element with a new buffer (managed by the workingCopyOwner) based on the underlying element  commitWorkingCopy(): Apply changes to the underlying element  Refactoring uses this to first try all changes in a sandbox to only apply them if compilable  Working copy owner: Connects working copies so that they reference each other Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 15
  • 16. Java Element Change Notifications Change Listeners: JavaCore.addElementChangedListener (IElementChangedListener)  Java element delta information for all changes: Class path changes, added/removed elements, changed source, change to buffered state (working copy)  Changes triggered by resource change notifications (resource deltas), call to ‘reconcile()’  Java element deltas do not contain the old state (not a diff)  The granularity ends at the member level (no AST) IJavaElementDelta: Description of changes of an element or its children Delta kind Descriptions and additional flags ADDED Element has been added REMOVED Element has been removed CHANGED F_CONTENT Content has changed. If F_FINE_GRAINED is set: Analysis of structural changed has been performed F_MODIFIERS Changed modifiers F_CHILDREN Deltas in children IJavaElementDelta[] getAffectedChildren() F_ADDED_TO_CLASSPATH, F_SOURCEATTACHED, F_REORDER, F_PRIMARY_WORKING_COPY,… Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 16
  • 17. JavaElementListener – an Example Find out if types were added or removed fJavaListener= new IElementChangedListener() { public void elementChanged(ElementChangedEvent event) { Parent constructs: boolean res= hasTypeAddedOrRemoved(event.getDelta()); Recursively go } down the delta private boolean hasTypeAddedOrRemoved(IJavaElementDelta delta) { tree IJavaElement elem= delta.getElement(); boolean isAddedOrRemoved= (delta.getKind() != IJavaElementDelta.CHANGED); switch (elem.getElementType()) { case IJavaElement.JAVA_MODEL: case IJavaElement.JAVA_PROJECT: case IJavaElement.PACKAGE_FRAGMENT_ROOT: case IJavaElement.PACKAGE_FRAGMENT: if (isAddedOrRemoved) return true; return processChildrenDelta(delta.getAffectedChildren()); case IJavaElement.COMPILATION_UNIT: ICompilationUnit cu= (ICompilationUnit) elem; Be aware of if (!cu.getPrimary().equals(cu)) private return false; if (isAddedOrRemoved || isPossibleStructuralChange(delta.getFlags())) working return true; copies return processChildrenDelta(delta.getAffectedChildren()); case IJavaElement.TYPE: if (isAddedOrRemoved) return true; return processChildrenDelta(delta.getAffectedChildren()); // inner types default: // fields, methods, imports... return false; } } } Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 17
  • 18. JavaElementListener – cont’d private static boolean isPossibleStructuralChange(int flags) { return hasSet(flags, IJavaElementDelta.F_CONTENT) && !hasSet(flags , IJavaElementDelta.F_FINE_GRAINED)); } private boolean processChildrenDelta(IJavaElementDelta[] children) { for (int i= 0; i < children.length; i++) { if (hasTypeAddedOrRemoved(children[i])) return true; ‘Fine Grained’ set means that } return false; children deltas have been } computed. If not, it is a unknown change (potentially Visit delta children recursively full change) Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 18
  • 19. Type Hierarchy - Design Motivation Subtype hierarchies are expensive to create and maintain. Why not having an API IType.getSubtypes()?  Bad performance for repeated queries in the same hierarchy Why not keep a constantly updated hierarchy in memory?  Does not scale for big workspaces. JDT is not alone in the workbench and should avoid holding on to lots of memory.  Expensive updating. Every class path change would require types to recheck if they still resolve to the same type Chosen solution:  Explicit hierarchy object  Defined life cycle  Well known creation costs (sub type relationship is stored in index files)  Allows scoped hierarchies Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 19
  • 20. Type Hierarchy  Snapshot of ITypes in a sub/super type relationship  Used in Type Hierarchy view Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 20
  • 21. Type Hierarchy Create – on a type or on a region (= set of Java Elements) typeHierarchy= type.newTypeHierarchy(progressMonitor); typeHierarchy= project.newTypeHierarchy(region, progressMonitor); Supertype hierarchy – faster! typeHierarchy= type.newSupertypeHierarchy(progressMonitor); Get super and subtypes, interfaces and classes typeHierarchy.getSubtypes(type) Change listener – when changed, refresh is required typeHierarchy.addTypeHierarchyChangedListener(..); typeHierarchy.refresh(progressMonitor); Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 21
  • 22. Code Resolve  Resolve the element at the given offset and length in the source javaElements= compilationUnit.codeSelect(50, 10);  Used for Navigate > Open (F3) and tool tips Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 22
  • 23. Code Resolve – an Example Set up a compilation Resolving the reference to “String” in a compilation unit unit String content = "public class X {" + "n" + " String field;" + "n" + "}"; ICompilationUnit cu= fragment.createCompilationUnit(“X.java", content, false, null); int start = content.indexOf("String"); int length = "String".length(); IJavaElement[] declarations = cu.codeSelect(start, length); Contains a single IType: ‘java.lang.String’ Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 23
  • 24. More Java Model Features Navigation – resolve a name IType type= javaProject.findType("java.util.Vector"); Context – resolve an enclosing element element= compilationUnit.getElementAt(position); Code assist – evaluate completions for a given offset compilationUnit.codeComplete(offset, resultRequestor); Code formatting ToolFactory.createCodeFormatter(options) .format(kind, string, offset, length, indentationLevel, lineSeparator); Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 24
  • 25. API in JDT UI Labels, images, structure, order for IJavaElements:  JavaElementLabelProvider  StandardJavaElementContentProvider  JavaElementComparator Selection and configuration dialogs, wizards  JavaUI.createPackageDialog(..), JavaUI.createTypeDialog(..)  BuildPathDialogAccess  NewClassWizardPage, NewInterfaceWizardPage…  JavadocExportWizardPage, NewJavaProjectWizardPageOne / Two Java Actions to add to context menus  package org.eclipse.jdt.ui.actions  New in 3.6: org.eclipse.jdt.ui.actions.OpenAttachedJavadocAction Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 25
  • 26. Second Pillar: Search Engine Java Model – Lightweight model for views Search Engine  Design motivation  Using the search engine  Code example AST – Precise, fully resolved compiler parse tree Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 26
  • 27. Search Engine – Design Motivation Need quick access to all references or declarations of a Java element  Searching for all references to type “A”  Used to build call graphs  All types in workspace Trade-off between search and update performance Chosen solution:  Index based search engine  Index is “word” based. It doesn’t contain resolved information (e.g. class U references method foo(), not method A#foo()).  Special resolve step needed to narrow down matches reported from index (e.g. searching for B#foo() must not report U). Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 27
  • 28. Search Engine  Search for declarations and references  packages, types, fields, methods and constructors  using wildcards (including camel-case) or from a Java element  Scoped search  region = set of Java elements  predefined workspace and hierarchy scopes  Potential matches  Code with errors, incomplete class paths  Limit the match locations  in casts, in catch clauses, only return types… Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 28
  • 29. Search Engine – Using the APIs  Creating a search pattern SearchPattern.createPattern("foo*", IJavaSearchConstants.FIELD, IJavaSearchConstants.REFERENCES, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);  Creating a search scope SearchEngine.createWorkspaceScope(); SearchEngine.createJavaSearchScope(new IJavaElement[] { project }); SearchEngine.createHierarchyScope(type); SearchEngine.createStrictHierarchyScope( project, type, onlySubtypes, includeFocusType, progressMonitor);  Collecting results  Subclass SearchRequestor  Each result reported as a SearchMatch Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 29
  • 30. Search Engine – an Example Searching for all declarations of methods “foo” that return an int Search pattern SearchPattern pattern = SearchPattern.createPattern( "foo(*) int", IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH); Search scope IJavaSearchScope scope = SearchEngine.createWorkspaceScope(); SearchRequestor requestor = new SearchRequestor() { public void acceptSearchMatch(SearchMatch match) { System.out.println(match.getElement()); Result } collector }; SearchEngine searchEngine = new SearchEngine(); Start search searchEngine.search( pattern, new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null /*progress monitor*/); Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 30
  • 31. The 3 Pillars – Third Pillar: AST Java Model – Lightweight model for views Search Engine AST – Precise, fully resolved compiler parse tree  Overall design  Creating an AST  AST node details  Bindings  AST rewrite  Refactoring toolkit Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 31
  • 32. Abstract Syntax Tree - Design Motivation Java Model and type hierarchy are optimized to present model elements in a view. Refactorings and code manipulation features need fully resolved information down to statement level to perform exact code analysis. Need a way to manipulate source code on a higher abstraction than characters. Chosen solution:  On-demand created abstract syntax tree with all resolved bindings  Defined life cycle  Well known creation costs  Abstract syntax tree rewriter to manipulate code on language element level Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 32
  • 33. Abstract Syntax Tree Source Code ASTParser#createAST(...) AST ReturnStatement expression InfixExpression leftOperand rightOperand resolveBinding MethodInvocation SimpleName IMethodBinding Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 33
  • 34. Abstract Syntax Tree cond’t A Java type for each syntactic construct Assignment, CastExpression, ConditionalExpression… Bindings for type information Can resolve all references through bindings Visitors and node properties for analysis ASTRewriter to manipulate an AST Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 34
  • 35. Creating an AST  Build AST with AST factory: ASTParser  Either from Java model elements: ICompilationUnit, IClassFile (ITypeRoot)  Or source string, file name and IJavaProject as context  Bindings or no bindings  Bindings contain resolved information. Fully available on syntax-error-free code, best effort when there are errors.  Full AST or partial AST  For a given source position: All other methods have empty bodies  AST for an element: Only method, statement or expression Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 35
  • 36. Creating an AST  Statements recovery  No recovery: When detecting syntax error: Skip method body  With recovery: Skip tokens, or introduce artificial tokens to create statements. Recovered node are flagged with ASTNode#RECOVERED  Bindings recovery  No recovery: No bindings if element can not be found (for example is not on the class path)  With recovery: Introduce recovered bindings, only name is correct, no package or members. Bindings marked with binding.isRecovered()  Create multiple ASTs using same binding environment, much faster  setIgnoreMethodBodies(boolean): Can be used when the method bodies are not needed. This saves a lot of memory.  New in 3.6, bindings can be resolved without an Eclipse workspace: ASTParser#setEnvironment(..) Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 36
  • 37. Creating an AST ASTParser parser= ASTParser.newParser(AST.JLS3); parser.setSource(cu); parser.setResolveBindings(true); Create AST on an parser.setStatementsRecovery(true); element ASTNode node= parser.createAST(null); ASTParser parser= ASTParser.newParser(AST.JLS3); parser.setSource("System.out.println();".toCharArray()); parser.setProject(javaProject); parser.setKind(ASTParser.K_STATEMENTS); parser.setStatementsRecovery(false); Create AST on source ASTNode node= parser.createAST(null); string Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 37
  • 38. AST Browsing Typed access to the node children: ConditionalExpression: getExpression() getThenExpression() getElseExpression() Homogenous access using node properties: List allProperties= node.structuralPropertiesForType(); Will contain 3 elements of type ‘StructuralPropertyDescriptor’: ConditionalExpression.EXPRESSION_PROPERTY, ConditionalExpression.THEN_EXPRESSION_PROPERTY, ConditionalExpression.ELSE_EXPRESSION_PROPERTY, expression= node.getStructuralProperty(ConditionalExpression.EXPRESSION_PROPERTY); Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 38
  • 39. ASTView Demo ASTView and JavaElement view: http://www.eclipse.org/jdt/ui/update-site Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 39
  • 40. AST View private void print(ASTNode node) { List properties= node.structuralPropertiesForType(); for (Iterator iterator= properties.iterator(); iterator.hasNext();) { Object descriptor= iterator.next(); if (descriptor instanceof SimplePropertyDescriptor) { SimplePropertyDescriptor simple= (SimplePropertyDescriptor)descriptor; Object value= node.getStructuralProperty(simple); System.out.println(simple.getId() + " (" + value.toString() + ")"); } else if (descriptor instanceof ChildPropertyDescriptor) { ChildPropertyDescriptor child= (ChildPropertyDescriptor)descriptor; ASTNode childNode= (ASTNode)node.getStructuralProperty(child); if (childNode != null) { System.out.println("Child (" + child.getId() + ") {"); print(childNode); System.out.println("}"); } } else { ChildListPropertyDescriptor list= (ChildListPropertyDescriptor)descriptor; System.out.println("List (" + list.getId() + "){"); print((List)node.getStructuralProperty(list)); System.out.println("}"); } } } private void print(List nodes) { for (Iterator iterator= nodes.iterator(); iterator.hasNext();) { ASTNode node= (ASTNode)iterator.next(); print(node); } } Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 40
  • 41. Bindings Bindings are fully connected  ITypeBinding has bindings for super type, interfaces, all members  IMethodBinding has bindings for parameter types, exceptions, return type  IVariableBinding has binding for variable type Bindings retain a lot of memory:  Do not hold on bindings  Do not hold on ASTNodes that contain bindings Within an AST:  Binding identity (can use ‘==‘ to compare bindings) Bindings from different ASTs:  Compare binding.getKey()  Or isEqualTo(…) Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 41
  • 42. Bindings cont’d From a binding to its declaring ASTNode:  astRoot.findDeclaringNode(binding) (on CompilationUnit) From a binding to an IJavaElement:  binding.getJavaElement() Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 42
  • 43. AST Visitor ASTParser parser= ASTParser.newParser(AST.JLS3); parser.setSource(cu); parser.setResolveBindings(true); Count the number of casts ASTNode root= parser.createAST(null); root.accept(new ASTVisitor() { public boolean visit(CastExpression node) { fCastCount++; return true; Count the number of references } to a field of ‘java.lang.System’ (‘System.out’, ‘System.err’) public boolean visit(SimpleName node) { IBinding binding= node.resolveBinding(); if (binding instanceof IVariableBinding) { IVariableBinding varBinding= (IVariableBinding) binding; ITypeBinding declaringType= varBinding.getDeclaringClass(); if (varBinding.isField() && "java.lang.System".equals(declaringType.getQualifiedName())) { fAccessesToSystemFields++; } } return true; } Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 43
  • 44. AST Rewriting  Instead of manipulating the source code, change the AST and write changes back to source  Descriptive approach  describe changes without actually modifying the AST  allows reuse of the AST for multiple independent rewrites  support generation of a preview  Modifying approach  directly manipulates the AST  API is more intuitive  implemented using the descriptive rewriter  Rewriter characteristics  preserves user formatting and markers  generates a TextEdit that describes document changes Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 44
  • 45. AST Rewriting cont’d Implementation of descriptive rewrite is more powerful:  String placeholders: Use a node that is a placeholder for an arbitrary string of code or comments  Track node positions: Get the new source ranges after the rewrite  Copy a range of nodes  Modify the comment mapping heuristic used by the rewriter (comments are associated with nodes. Operation on nodes also include the associated comments) Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 45
  • 46. AST Rewrite cont’d Example of the descriptive AST rewrite: public void modify(MethodDeclaration decl) { AST ast= decl.getAST(); Create the rewriter ASTRewrite astRewrite= ASTRewrite.create(ast); Change the method name SimpleName newName= ast.newSimpleName("newName"); astRewrite.set(decl, MethodDeclaration.NAME_PROPERTY, newName, null); ListRewrite paramRewrite= astRewrite.getListRewrite(decl, MethodDeclaration.PARAMETERS_PROPERTY); SingleVariableDeclaration newParam= ast.newSingleVariableDeclaration(); newParam.setType(ast.newPrimitiveType(PrimitiveType.INT)); newParam.setName(ast.newSimpleName("p1")); paramRewrite.insertFirst(newParam, null); TextEdit edit= astRewrite.rewriteAST(document, null); Insert a new parameter edit.apply(document); as first parameter Create resulting edit script } Apply edit script to source buffer Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 46
  • 47. Code Manipulation Toolkits  Refactoring – org.eclipse.ltk.refactoring  refactorings - org.eclipse.ltk.core.refactoring.Refactoring  responsible for precondition checking  create code changes  code changes - org.eclipse.ltk.core.refactoring.Change  provide Undo/Redo support  support non-textual changes (e.g. renaming a file)  support textual changes based on text edit support  user interface is wizard-based  Quick Fix & Quick Assist – org.eclipse.jdt.ui.text.java  processors - org.eclipse.jdt.ui.text.java.IQuickFixProcessor  check availability based on problem identifier  generate a list of fixes  user interface is provided by editor Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 47
  • 48. The Batch Compiler Java Model – Lightweight model for views Search Engine AST – Precise, fully resolved compiler parse tree  Overall design  Creating an AST  AST node details  Bindings  AST rewrite  Refactoring toolkit Batch Compiler Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 48
  • 49. The Batch Compiler  Eclipse provides and uses its own compiler that is not javac  The Eclipse compiler is used inside the IDE (Eclipse)  The Eclipse compiler can also be used as a pure batch compiler outside of Eclipse  The Eclipse batch compiler can be used as:  A command line tool  A compiler adapter inside an Ant task:  As a compiler service used by the Compiler API (jsr 199) Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 49
  • 50. Summary  JDT delivers powerful program manipulation services  Java Model, Search engine and DOM AST  Use them to add your own tool to the Eclipse Java IDE  but also in headless mode (can be used programmatically)  E.g. EMF, metrics tools, …  Full J2SE 5.0/6.0 support  Full-fledged batch compiler  Community feedback is essential  bug reports: https://bugs.eclipse.org/bugs/enter_bug.cgi?product=JDT  mailing lists: http://www.eclipse.org/mail/index.html  newsgroups: news://news.eclipse.org/eclipse.tools.jdt Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 50
  • 51. Legal Notice  Copyright © IBM Corp., 2007-2010. All rights reserved. This presentation and the source code in it are made available under the EPL, v1.0.  Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.  Eclipse and the Eclipse logo are trademarks of Eclipse Foundation, Inc.  IBM and the IBM logo are trademarks or registered trademarks of IBM Corporation, in the United States, other countries or both.  Other company, product, or service names may be trademarks or service marks of others.  THE INFORMATION DISCUSSED IN THIS PRESENTATION IS PROVIDED FOR INFORMATIONAL PURPOSES ONLY. WHILE EFFORTS WERE MADE TO VERIFY THE COMPLETENESS AND ACCURACY OF THE INFORMATION, IT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, AND IBM SHALL NOT BE RESPONSIBLE FOR ANY DAMAGES ARISING OUT OF THE USE OF, OR OTHERWISE RELATED TO, SUCH INFORMATION. ANY INFORMATION CONCERNING IBM'S PRODUCT PLANS OR STRATEGY IS SUBJECT TO CHANGE BY IBM WITHOUT NOTICE Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 51
  • 52. The JDT Team Daniel Megert Frédéric Fusier Markus Keller Deepak Azad Ayushman Jain Jayaprakash Arthanareeswaran Raksha Vasisht Satyam Rama Kandula Srikanth Adayapalam Olivier Thomann Michael Rennie Darin Wright Copyright © IBM Corp., 2010. All rights reserved. Licensed under EPL, v1.0. 52