<s> package org . eclipse . jdt . internal . core . hierarchy ; import java . util . ArrayList ; import org . eclipse . core . runtime . CoreException ; import org . eclipse . jdt . core . * ; import org . eclipse . jdt . core . search . IJavaSearchScope ; import org . eclipse . jdt . internal . core . CompilationUnit ; import org . eclipse . jdt . internal . core . JavaElement ; import org . eclipse . jdt . internal . core . Openable ; import org . eclipse . jdt . internal . core . Region ; import org . eclipse . jdt . internal . core . TypeVector ; public class RegionBasedTypeHierarchy extends TypeHierarchy { protected IRegion region ; public RegionBasedTypeHierarchy ( IRegion region , ICompilationUnit [ ] workingCopies , IType type , boolean computeSubtypes ) { super ( type , workingCopies , ( IJavaSearchScope ) null , computeSubtypes ) ; Region newRegion = new Region ( ) { public void add ( IJavaElement element ) { if ( ! contains ( element ) ) { removeAllChildren ( element ) ; this . rootElements . add ( element ) ; if ( element . getElementType ( ) == IJavaElement . JAVA_PROJECT ) { try { IPackageFragmentRoot [ ] roots = ( ( IJavaProject ) element ) . getPackageFragmentRoots ( ) ; for ( int i = 0 , length = roots . length ; i < length ; i ++ ) { if ( roots [ i ] . isArchive ( ) && ! this . rootElements . contains ( roots [ i ] ) ) this . rootElements . add ( roots [ i ] ) ; } } catch ( JavaModelException e ) { } } this . rootElements . trimToSize ( ) ; } } } ; IJavaElement [ ] elements = region . getElements ( ) ; for ( int i = 0 , length = elements . length ; i < length ; i ++ ) { newRegion . add ( elements [ i ] ) ; } this . region = newRegion ; if ( elements . length > 0 ) this . project = elements [ 0 ] . getJavaProject ( ) ; } protected void initializeRegions ( ) { super . initializeRegions ( ) ; IJavaElement [ ] roots = this . region . getElements ( ) ; for ( int i = 0 ; i < roots . length ; i ++ ) { IJavaElement root = roots [ i ] ; if ( root instanceof IOpenable ) { this . files . put ( root , new ArrayList ( ) ) ; } else { Openable o = ( Openable ) ( ( JavaElement ) root ) . getOpenableParent ( ) ; if ( o != null ) { this . files . put ( o , new ArrayList ( ) ) ; } } checkCanceled ( ) ; } } protected void compute ( ) throws JavaModelException , CoreException { HierarchyBuilder builder = new RegionBasedHierarchyBuilder ( this ) ; builder . build ( this . computeSubtypes ) ; } protected boolean isAffectedByOpenable ( IJavaElementDelta delta , IJavaElement element , int eventType ) { if ( element instanceof CompilationUnit && ( ( CompilationUnit ) element ) . isWorkingCopy ( ) ) { return super . isAffectedByOpenable ( delta , element , eventType ) ; } if ( this . focusType == null ) { return this . region . contains ( element ) ; } else { return super . isAffectedByOpenable ( delta , element , eventType ) ; } } public IJavaProject javaProject ( ) { return this . project ; } public void pruneDeadBranches ( ) { pruneDeadBranches ( getRootClasses ( ) ) ; pruneDeadBranches ( getRootInterfaces ( ) ) ; } private boolean pruneDeadBranches ( IType type ) { TypeVector subtypes = ( TypeVector ) this . typeToSubtypes . get ( type ) ; if ( subtypes == null ) return true ; pruneDeadBranches ( subtypes . copy ( ) . elements ( ) ) ; subtypes = ( TypeVector ) this . typeToSubtypes . get ( type ) ; return ( subtypes == null || subtypes . size == 0 ) ; } private void pruneDeadBranches ( IType [ ] types ) { for ( int i = 0 , length = types . length ; i < length ; i ++ ) { IType type = types [ i ] ; if ( pruneDeadBranches ( type ) && ! this . region . contains ( type ) ) { removeType ( type ) ; } } } protected void removeType ( IType type ) { IType [ ] subtypes = getSubtypes ( type ) ; this . typeToSubtypes . remove ( type ) ; if ( subtypes != null ) { for ( int i = 0 ; i < subtypes . length ; i ++ ) { removeType ( subtypes [ i ] ) ; } } IType superclass = ( IType ) this . classToSuperclass . remove ( type ) ; if ( superclass != null ) { TypeVector types = ( TypeVector ) this . typeToSubtypes . get ( superclass ) ; if ( types != null ) types . remove ( type ) ; } IType [ ] superinterfaces = ( IType [ ] ) this . typeToSuperInterfaces . remove ( type ) ; if ( superinterfaces != null ) { for ( int i = 0 , length = superinterfaces . length ; i < length ; i ++ ) { IType superinterface = superinterfaces [ i ] ; TypeVector types = ( TypeVector ) this . typeToSubtypes . get ( superinterface ) ; if ( types != null ) types . remove ( type ) ; } } this . interfaces . remove ( type ) ; } } </s>