| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013, the Dart project authors. | 2 * Copyright (c) 2013, the Dart project authors. |
| 3 * | 3 * |
| 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u
se this file except | 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u
se this file except |
| 5 * in compliance with the License. You may obtain a copy of the License at | 5 * in compliance with the License. You may obtain a copy of the License at |
| 6 * | 6 * |
| 7 * http://www.eclipse.org/legal/epl-v10.html | 7 * http://www.eclipse.org/legal/epl-v10.html |
| 8 * | 8 * |
| 9 * Unless required by applicable law or agreed to in writing, software distribut
ed under the License | 9 * Unless required by applicable law or agreed to in writing, software distribut
ed under the License |
| 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K
IND, either express | 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K
IND, either express |
| 11 * or implied. See the License for the specific language governing permissions a
nd limitations under | 11 * or implied. See the License for the specific language governing permissions a
nd limitations under |
| 12 * the License. | 12 * the License. |
| 13 */ | 13 */ |
| 14 package com.google.dart.tools.core.internal.analysis.model; | 14 package com.google.dart.tools.core.internal.analysis.model; |
| 15 | 15 |
| 16 import com.google.dart.engine.AnalysisEngine; | 16 import com.google.dart.engine.AnalysisEngine; |
| 17 import com.google.dart.engine.context.AnalysisContext; | 17 import com.google.dart.engine.context.AnalysisContext; |
| 18 import com.google.dart.engine.index.Index; | 18 import com.google.dart.engine.index.Index; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 import java.util.Collection; | 61 import java.util.Collection; |
| 62 import java.util.HashMap; | 62 import java.util.HashMap; |
| 63 import java.util.HashSet; | 63 import java.util.HashSet; |
| 64 import java.util.Iterator; | 64 import java.util.Iterator; |
| 65 import java.util.List; | 65 import java.util.List; |
| 66 import java.util.Map.Entry; | 66 import java.util.Map.Entry; |
| 67 import java.util.Set; | 67 import java.util.Set; |
| 68 | 68 |
| 69 /** | 69 /** |
| 70 * Represents an Eclipse project that has a Dart nature. | 70 * Represents an Eclipse project that has a Dart nature. |
| 71 * | 71 * |
| 72 * @coverage dart.tools.core.model | 72 * @coverage dart.tools.core.model |
| 73 */ | 73 */ |
| 74 public class ProjectImpl extends ContextManagerImpl implements Project { | 74 public class ProjectImpl extends ContextManagerImpl implements Project { |
| 75 | 75 |
| 76 public static class AnalysisContextFactory { | 76 public static class AnalysisContextFactory { |
| 77 public AnalysisContext createContext() { | 77 public AnalysisContext createContext() { |
| 78 return AnalysisEngine.getInstance().createAnalysisContext(); | 78 return AnalysisEngine.getInstance().createAnalysisContext(); |
| 79 } | 79 } |
| 80 | 80 |
| 81 public File[] getPackageRoots(IContainer container) { | 81 public File[] getPackageRoots(IContainer container) { |
| 82 return ProjectImpl.getPackageRoots( | 82 return ProjectImpl.getPackageRoots( |
| 83 DartCore.getPlugin(), | 83 DartCore.getPlugin(), |
| 84 CmdLineOptions.getOptions(), | 84 CmdLineOptions.getOptions(), |
| 85 container); | 85 container); |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 | 88 |
| 89 /** | 89 /** |
| 90 * Answer the package roots for the specified project with the given options.
May return an empty | 90 * Answer the package roots for the specified project with the given options.
May return an empty |
| 91 * array if no package roots are specified either at the project level or in t
he command line | 91 * array if no package roots are specified either at the project level or in t
he command line |
| 92 * options. | 92 * options. |
| 93 * | 93 * |
| 94 * @param core the instance of DartCore used to access project preferences | 94 * @param core the instance of DartCore used to access project preferences |
| 95 * @param options the command line options (not {@code null}) | 95 * @param options the command line options (not {@code null}) |
| 96 * @param container the container for which package roots are to be returned | 96 * @param container the container for which package roots are to be returned |
| 97 * @return the package roots (not {@code null}, contains no {@code null}s) | 97 * @return the package roots (not {@code null}, contains no {@code null}s) |
| 98 */ | 98 */ |
| 99 public static File[] getPackageRoots(DartCore core, CmdLineOptions options, IC
ontainer container) { | 99 public static File[] getPackageRoots( |
| 100 DartCore core, CmdLineOptions options, IContainer container) { |
| 100 if (container instanceof IProject) { | 101 if (container instanceof IProject) { |
| 101 IEclipsePreferences prefs = core.getProjectPreferences((IProject) containe
r); | 102 IEclipsePreferences prefs = core.getProjectPreferences((IProject) containe
r); |
| 102 String setting = prefs.get(DartCore.PROJECT_PREF_PACKAGE_ROOT, ""); | 103 String setting = prefs.get(DartCore.PROJECT_PREF_PACKAGE_ROOT, ""); |
| 103 if (setting != null && setting.length() > 0) { | 104 if (setting != null && setting.length() > 0) { |
| 104 ArrayList<File> files = new ArrayList<File>(); | 105 ArrayList<File> files = new ArrayList<File>(); |
| 105 String[] paths = setting.split(File.pathSeparator); | 106 String[] paths = setting.split(File.pathSeparator); |
| 106 for (String path : paths) { | 107 for (String path : paths) { |
| 107 files.add(new File(path)); | 108 files.add(new File(path)); |
| 108 } | 109 } |
| 109 return files.toArray(new File[files.size()]); | 110 return files.toArray(new File[files.size()]); |
| 110 } | 111 } |
| 111 | 112 |
| 112 File packOverrideDir = options.getPackageOverrideDirectory(); | 113 File packOverrideDir = options.getPackageOverrideDirectory(); |
| 113 if (packOverrideDir != null) { | 114 if (packOverrideDir != null) { |
| 114 File root = new File(packOverrideDir, container.getLocation().toOSString
()); | 115 File root = new File(packOverrideDir, container.getLocation().toOSString
()); |
| 115 return new File[] {new File(root, DartCore.PACKAGES_DIRECTORY_NAME)}; | 116 return new File[] {new File(root, DartCore.PACKAGES_DIRECTORY_NAME)}; |
| 116 } | 117 } |
| 117 | 118 |
| 118 } | 119 } |
| 119 return options.getPackageRoots(); | 120 return options.getPackageRoots(); |
| 120 } | 121 } |
| 121 | 122 |
| 122 /** | 123 /** |
| 123 * The Eclipse project associated with this Dart project (not {@code null}) | 124 * The Eclipse project associated with this Dart project (not {@code null}) |
| 124 */ | 125 */ |
| 125 private final IProject projectResource; | 126 private final IProject projectResource; |
| 126 | 127 |
| 127 /** | 128 /** |
| 128 * The project resource location on disk or {@code null} if it has not yet bee
n initialized. | 129 * The project resource location on disk or {@code null} if it has not yet bee
n initialized. |
| 129 * | 130 * |
| 130 * @see #getResourceLocation() | 131 * @see #getResourceLocation() |
| 131 */ | 132 */ |
| 132 private IPath projectResourceLocation; | 133 private IPath projectResourceLocation; |
| 133 | 134 |
| 134 /** | 135 /** |
| 135 * The factory used to create new {@link AnalysisContext} (not {@code null}) | 136 * The factory used to create new {@link AnalysisContext} (not {@code null}) |
| 136 */ | 137 */ |
| 137 private final AnalysisContextFactory factory; | 138 private final AnalysisContextFactory factory; |
| 138 | 139 |
| 139 /** | 140 /** |
| (...skipping 14 matching lines...) Expand all Loading... |
| 154 * no pubspec or package root is defined. | 155 * no pubspec or package root is defined. |
| 155 */ | 156 */ |
| 156 private ResourceMap defaultResourceMap; | 157 private ResourceMap defaultResourceMap; |
| 157 | 158 |
| 158 /** | 159 /** |
| 159 * The index which is updated when contexts are discarded (not {@code null}). | 160 * The index which is updated when contexts are discarded (not {@code null}). |
| 160 */ | 161 */ |
| 161 private final Index index; | 162 private final Index index; |
| 162 | 163 |
| 163 /** | 164 /** |
| 165 * The default package resolver used for the project |
| 166 */ |
| 167 private UriResolver defaultPackageResolver; |
| 168 |
| 169 /** |
| 164 * Construct a new instance representing a Dart project | 170 * Construct a new instance representing a Dart project |
| 165 * | 171 * |
| 166 * @param resource the Eclipse project associated with this Dart project (not
{@code null}) | 172 * @param resource the Eclipse project associated with this Dart project (not
{@code null}) |
| 167 * @param sdk the Dart SDK to use when initializing contexts (not {@code null}
) | 173 * @param sdk the Dart SDK to use when initializing contexts (not {@code null}
) |
| 168 */ | 174 */ |
| 169 public ProjectImpl(IProject resource, DartSdk sdk) { | 175 public ProjectImpl(IProject resource, DartSdk sdk) { |
| 170 this(resource, sdk, DartCore.getProjectManager().getIndex(), new AnalysisCon
textFactory()); | 176 this(resource, sdk, DartCore.getProjectManager().getIndex(), new AnalysisCon
textFactory()); |
| 171 } | 177 } |
| 172 | 178 |
| 173 /** | 179 /** |
| 174 * Construct a new instance representing a Dart project | 180 * Construct a new instance representing a Dart project |
| 175 * | 181 * |
| 176 * @param resource the Eclipse project associated with this Dart project (not
{@code null}) | 182 * @param resource the Eclipse project associated with this Dart project (not
{@code null}) |
| 177 * @param sdk the Dart SDK to use when initializing contexts (not {@code null}
) | 183 * @param sdk the Dart SDK to use when initializing contexts (not {@code null}
) |
| 178 * @param index the index to be updated when contexts are discarded (not {@cod
e null}) | 184 * @param index the index to be updated when contexts are discarded (not {@cod
e null}) |
| 179 * @param factory the factory used to construct new analysis contexts (not {@c
ode null}) | 185 * @param factory the factory used to construct new analysis contexts (not {@c
ode null}) |
| 180 */ | 186 */ |
| 181 public ProjectImpl(IProject resource, DartSdk sdk, Index index, AnalysisContex
tFactory factory) { | 187 public ProjectImpl(IProject resource, DartSdk sdk, Index index, AnalysisContex
tFactory factory) { |
| 182 super(sdk); | 188 super(sdk); |
| 183 if (resource == null | factory == null | sdk == null) { | 189 if (resource == null | factory == null | sdk == null) { |
| 184 throw new IllegalArgumentException(); | 190 throw new IllegalArgumentException(); |
| 185 } | 191 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 return; | 368 return; |
| 363 } | 369 } |
| 364 | 370 |
| 365 // If there is already a pubFolder, then ignore the addition | 371 // If there is already a pubFolder, then ignore the addition |
| 366 if (getPubFolder(container.getFullPath()) != null) { | 372 if (getPubFolder(container.getFullPath()) != null) { |
| 367 return; | 373 return; |
| 368 } | 374 } |
| 369 | 375 |
| 370 // Create and cache a new pub folder | 376 // Create and cache a new pub folder |
| 371 DartSdk sdk = getSdk(); | 377 DartSdk sdk = getSdk(); |
| 372 PubFolderImpl pubFolder = new PubFolderImpl(container, createContext(conta
iner, sdk), sdk); | 378 UriResolver pkgResolver = getPackageUriResolver(container, sdk, true); |
| 379 PubFolderImpl pubFolder = new PubFolderImpl( |
| 380 container, |
| 381 createContext(container, sdk), |
| 382 sdk, |
| 383 pkgResolver); |
| 373 pubFolders.put(container.getFullPath(), pubFolder); | 384 pubFolders.put(container.getFullPath(), pubFolder); |
| 374 | 385 |
| 375 // If this is the project, then adjust the context source factory | 386 // If this is the project, then adjust the context source factory |
| 376 if (container.getType() == PROJECT) { | 387 if (container.getType() == PROJECT) { |
| 377 initContext( | 388 initContext( |
| 378 defaultContext, | 389 defaultContext, |
| 379 projectResource, | 390 projectResource, |
| 380 sdk, | 391 sdk, |
| 381 getPackageUriResolver(projectResource, sdk, true)); | 392 getPackageUriResolver(projectResource, sdk, true)); |
| 382 } | 393 } |
| 383 | 394 |
| 384 // Merge any overlapping pub folders | 395 // Merge any overlapping pub folders |
| 385 for (Iterator<Entry<IPath, PubFolder>> iter = pubFolders.entrySet().iterat
or(); iter.hasNext();) { | 396 for (Iterator<Entry<IPath, PubFolder>> iter = pubFolders.entrySet().iterat
or(); |
| 397 iter.hasNext();) { |
| 386 Entry<IPath, PubFolder> entry = iter.next(); | 398 Entry<IPath, PubFolder> entry = iter.next(); |
| 387 PubFolder parent = getParentPubFolder(entry.getKey()); | 399 PubFolder parent = getParentPubFolder(entry.getKey()); |
| 388 if (parent != null) { | 400 if (parent != null) { |
| 389 parent.getContext().mergeContext(entry.getValue().getContext()); | 401 parent.getContext().mergeContext(entry.getValue().getContext()); |
| 390 iter.remove(); | 402 iter.remove(); |
| 391 } | 403 } |
| 392 } | 404 } |
| 393 } | 405 } |
| 394 } | 406 } |
| 395 | 407 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 418 getSdk(), | 430 getSdk(), |
| 419 getPackageUriResolver(container, getSdk(), false)); | 431 getPackageUriResolver(container, getSdk(), false)); |
| 420 } | 432 } |
| 421 | 433 |
| 422 // Traverse container to find pubspec files that were overshadowed by the
one just removed | 434 // Traverse container to find pubspec files that were overshadowed by the
one just removed |
| 423 createPubFolders(container); | 435 createPubFolders(container); |
| 424 } | 436 } |
| 425 } | 437 } |
| 426 | 438 |
| 427 @Override | 439 @Override |
| 440 public String resolvePathToPackage(String path) { |
| 441 |
| 442 PubFolder folder = getPubFolder(new Path(path)); |
| 443 if (folder != null) { |
| 444 return folder.resolvePathToPackage(path); |
| 445 } else { |
| 446 if (defaultPackageResolver instanceof ExplicitPackageUriResolver) { |
| 447 return ((ExplicitPackageUriResolver) defaultPackageResolver).resolvePath
ToPackage(path); |
| 448 } |
| 449 } |
| 450 return null; |
| 451 } |
| 452 |
| 453 @Override |
| 428 public IFileInfo resolveUriToFileInfo(IResource relativeTo, String uri) { | 454 public IFileInfo resolveUriToFileInfo(IResource relativeTo, String uri) { |
| 429 | 455 |
| 430 AnalysisContext context = getContext(relativeTo); | 456 AnalysisContext context = getContext(relativeTo); |
| 431 Source source = context.getSourceFactory().forUri(uri); | 457 Source source = context.getSourceFactory().forUri(uri); |
| 432 | 458 |
| 433 ResourceMap map = getResourceMap(relativeTo); | 459 ResourceMap map = getResourceMap(relativeTo); |
| 434 if (source != null && map != null) { | 460 if (source != null && map != null) { |
| 435 IFile resource = map.getResource(source); | 461 IFile resource = map.getResource(source); |
| 436 if (resource != null) { | 462 if (resource != null) { |
| 437 return new FileInfo(resource); | 463 return new FileInfo(resource); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 } catch (Exception e) { | 495 } catch (Exception e) { |
| 470 name = "unknown: " + e.getMessage(); | 496 name = "unknown: " + e.getMessage(); |
| 471 } | 497 } |
| 472 return getClass().getSimpleName() + "[" + name + "]@" + Integer.toHexString(
hashCode()); | 498 return getClass().getSimpleName() + "[" + name + "]@" + Integer.toHexString(
hashCode()); |
| 473 } | 499 } |
| 474 | 500 |
| 475 /** | 501 /** |
| 476 * Answer the {@link AnalysisContext} for the specified container, creating on
e if necessary. Must | 502 * Answer the {@link AnalysisContext} for the specified container, creating on
e if necessary. Must |
| 477 * synchronize against {@link #pubFolders} before calling this method and eith
er call | 503 * synchronize against {@link #pubFolders} before calling this method and eith
er call |
| 478 * {@link #initialize()} or check that {@link #isInitialized()} returns {@code
true}. | 504 * {@link #initialize()} or check that {@link #isInitialized()} returns {@code
true}. |
| 479 * | 505 * |
| 480 * @param container the container with sources to be analyzed (not {@code null
}) | 506 * @param container the container with sources to be analyzed (not {@code null
}) |
| 481 * @param sdk the Dart SDK to use when initializing the context (not {@code nu
ll}) | 507 * @param sdk the Dart SDK to use when initializing the context (not {@code nu
ll}) |
| 482 * @return the context (not {@code null}) | 508 * @return the context (not {@code null}) |
| 483 */ | 509 */ |
| 484 private AnalysisContext createContext(IContainer container, DartSdk sdk) { | 510 private AnalysisContext createContext(IContainer container, DartSdk sdk) { |
| 485 if (container.equals(projectResource)) { | 511 if (container.equals(projectResource)) { |
| 486 return defaultContext; | 512 return defaultContext; |
| 487 } | 513 } |
| 488 AnalysisContext context; | 514 AnalysisContext context; |
| 489 IPath location = container.getLocation(); | 515 IPath location = container.getLocation(); |
| 490 if (location != null) { | 516 if (location != null) { |
| 491 SourceContainer sourceContainer = new DirectoryBasedSourceContainer(locati
on.toFile()); | 517 SourceContainer sourceContainer = new DirectoryBasedSourceContainer(locati
on.toFile()); |
| 492 context = defaultContext.extractContext(sourceContainer); | 518 context = defaultContext.extractContext(sourceContainer); |
| 493 } else { | 519 } else { |
| 494 logNoLocation(container); | 520 logNoLocation(container); |
| 495 context = factory.createContext(); | 521 context = factory.createContext(); |
| 496 } | 522 } |
| 497 return initContext(context, container, sdk, getPackageUriResolver(container,
sdk, true)); | 523 return initContext(context, container, sdk, getPackageUriResolver(container,
sdk, true)); |
| 498 } | 524 } |
| 499 | 525 |
| 500 /** | 526 /** |
| 501 * Create pub folders for any pubspec files found within the specified contain
er. Must synchronize | 527 * Create pub folders for any pubspec files found within the specified contain
er. Must synchronize |
| 502 * against {@link #pubFolders} before calling this method and either call {@li
nk #initialize()} or | 528 * against {@link #pubFolders} before calling this method and either call {@li
nk #initialize()} or |
| 503 * check that {@link #isInitialized()} returns {@code true}. | 529 * check that {@link #isInitialized()} returns {@code true}. |
| 504 * | 530 * |
| 505 * @param container the container (not {@code null}) | 531 * @param container the container (not {@code null}) |
| 506 */ | 532 */ |
| 507 private void createPubFolders(IContainer container) { | 533 private void createPubFolders(IContainer container) { |
| 508 DeltaProcessor processor = new DeltaProcessor(this); | 534 DeltaProcessor processor = new DeltaProcessor(this); |
| 509 processor.addDeltaListener(new DeltaAdapter() { | 535 processor.addDeltaListener(new DeltaAdapter() { |
| 510 @Override | 536 @Override |
| 511 public void pubspecAdded(ResourceDeltaEvent event) { | 537 public void pubspecAdded(ResourceDeltaEvent event) { |
| 512 IContainer container = event.getResource().getParent(); | 538 IContainer container = event.getResource().getParent(); |
| 513 IPath path = container.getFullPath(); | 539 IPath path = container.getFullPath(); |
| 514 // Pub folders do not nest, so don't create a folder if a parent folder
already exists | 540 // Pub folders do not nest, so don't create a folder if a parent folder
already exists |
| 515 if (getParentPubFolder(path) == null) { | 541 if (getParentPubFolder(path) == null) { |
| 516 DartSdk sdk = getSdk(); | 542 DartSdk sdk = getSdk(); |
| 517 pubFolders.put(path, new PubFolderImpl(container, createContext(contai
ner, sdk), sdk)); | 543 UriResolver pkgResolver = getPackageUriResolver(container, sdk, true); |
| 544 pubFolders.put( |
| 545 path, |
| 546 new PubFolderImpl(container, createContext(container, sdk), sdk, p
kgResolver)); |
| 518 } | 547 } |
| 519 } | 548 } |
| 520 }); | 549 }); |
| 521 try { | 550 try { |
| 522 processor.traverse(container); | 551 processor.traverse(container); |
| 523 } catch (CoreException e) { | 552 } catch (CoreException e) { |
| 524 DartCore.logError("Failed to build pub folder mapping", e); | 553 DartCore.logError("Failed to build pub folder mapping", e); |
| 525 } | 554 } |
| 526 // Remove nested pub folders | 555 // Remove nested pub folders |
| 527 Iterator<Entry<IPath, PubFolder>> iter = pubFolders.entrySet().iterator(); | 556 Iterator<Entry<IPath, PubFolder>> iter = pubFolders.entrySet().iterator(); |
| 528 while (iter.hasNext()) { | 557 while (iter.hasNext()) { |
| 529 Entry<IPath, PubFolder> entry = iter.next(); | 558 Entry<IPath, PubFolder> entry = iter.next(); |
| 530 PubFolder parent = getParentPubFolder(entry.getKey()); | 559 PubFolder parent = getParentPubFolder(entry.getKey()); |
| 531 if (parent != null) { | 560 if (parent != null) { |
| 532 parent.getContext().mergeContext(entry.getValue().getContext()); | 561 parent.getContext().mergeContext(entry.getValue().getContext()); |
| 533 iter.remove(); | 562 iter.remove(); |
| 534 } | 563 } |
| 535 } | 564 } |
| 536 } | 565 } |
| 537 | 566 |
| 538 /** | 567 /** |
| 539 * Answer all the {@link AnalysisContext} for this project. Must synchronize a
gainst | 568 * Answer all the {@link AnalysisContext} for this project. Must synchronize a
gainst |
| 540 * {@link #pubFolders} before calling this method and either call {@link #init
ialize()} or check | 569 * {@link #pubFolders} before calling this method and either call {@link #init
ialize()} or check |
| 541 * that {@link #isInitialized()} returns {@code true}. | 570 * that {@link #isInitialized()} returns {@code true}. |
| 542 * | 571 * |
| 543 * @return all the analysis contexts in the project | 572 * @return all the analysis contexts in the project |
| 544 */ | 573 */ |
| 545 private AnalysisContext[] getAnalysisContexts() { | 574 private AnalysisContext[] getAnalysisContexts() { |
| 546 Set<AnalysisContext> contexts = new HashSet<AnalysisContext>(); | 575 Set<AnalysisContext> contexts = new HashSet<AnalysisContext>(); |
| 547 for (PubFolder folder : getPubFolders()) { | 576 for (PubFolder folder : getPubFolders()) { |
| 548 contexts.add(folder.getContext()); | 577 contexts.add(folder.getContext()); |
| 549 } | 578 } |
| 550 contexts.add(getDefaultContext()); | 579 contexts.add(getDefaultContext()); |
| 551 return contexts.toArray(new AnalysisContext[contexts.size()]); | 580 return contexts.toArray(new AnalysisContext[contexts.size()]); |
| 552 } | 581 } |
| 553 | 582 |
| 554 /** | 583 /** |
| 555 * Find the most appropriate package resolver for the given container, based o
n presence of | 584 * Find the most appropriate package resolver for the given container, based o
n presence of |
| 556 * pubspec, package roots etc. | 585 * pubspec, package roots etc. |
| 557 * | 586 * |
| 558 * @return UriResolver used to resolve package: uris. | 587 * @return UriResolver used to resolve package: uris. |
| 559 */ | 588 */ |
| 560 private UriResolver getPackageUriResolver(IContainer container, DartSdk sdk, b
oolean hasPubspec) { | 589 private UriResolver getPackageUriResolver(IContainer container, DartSdk sdk, b
oolean hasPubspec) { |
| 561 | 590 |
| 562 UriResolver pkgResolver = null; | 591 UriResolver pkgResolver = null; |
| 563 File[] packageRoots = factory.getPackageRoots(container); | 592 File[] packageRoots = factory.getPackageRoots(container); |
| 564 File[] packagesDirs = null; | 593 File[] packagesDirs = null; |
| 565 if (hasPubspec) { | 594 if (hasPubspec) { |
| 566 IPath location = container.getLocation(); | 595 IPath location = container.getLocation(); |
| 567 if (location != null) { | 596 if (location != null) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 579 (DirectoryBasedDartSdk) sdk, | 608 (DirectoryBasedDartSdk) sdk, |
| 580 container.getLocation().toFile()); | 609 container.getLocation().toFile()); |
| 581 } | 610 } |
| 582 return pkgResolver; | 611 return pkgResolver; |
| 583 } | 612 } |
| 584 | 613 |
| 585 /** | 614 /** |
| 586 * Find the {@link PubFolder} defined for an ancestor. Must synchronize agains
t | 615 * Find the {@link PubFolder} defined for an ancestor. Must synchronize agains
t |
| 587 * {@link #pubFolders} before calling this method and either call {@link #init
ialize()} or check | 616 * {@link #pubFolders} before calling this method and either call {@link #init
ialize()} or check |
| 588 * that {@link #isInitialized()} returns {@code true}. | 617 * that {@link #isInitialized()} returns {@code true}. |
| 589 * | 618 * |
| 590 * @param path the resource's full path | 619 * @param path the resource's full path |
| 591 * @return the containing pub folder or {@code null} if none | 620 * @return the containing pub folder or {@code null} if none |
| 592 */ | 621 */ |
| 593 private PubFolder getParentPubFolder(IPath path) { | 622 private PubFolder getParentPubFolder(IPath path) { |
| 594 return path.segmentCount() > 1 ? getPubFolder(path.removeLastSegments(1)) :
null; | 623 return path.segmentCount() > 1 ? getPubFolder(path.removeLastSegments(1)) :
null; |
| 595 } | 624 } |
| 596 | 625 |
| 597 /** | 626 /** |
| 598 * Answer the {@link PubFolder} for the specified resource path. Must synchron
ize against | 627 * Answer the {@link PubFolder} for the specified resource path. Must synchron
ize against |
| 599 * {@link #pubFolders} before calling this method and either call {@link #init
ialize()} or check | 628 * {@link #pubFolders} before calling this method and either call {@link #init
ialize()} or check |
| 600 * that {@link #isInitialized()} returns {@code true}. | 629 * that {@link #isInitialized()} returns {@code true}. |
| 601 * | 630 * |
| 602 * @param path the resource full path (not {@code null}) | 631 * @param path the resource full path (not {@code null}) |
| 603 * @return the folder or {@code null} if none is found | 632 * @return the folder or {@code null} if none is found |
| 604 */ | 633 */ |
| 605 private PubFolder getPubFolder(IPath path) { | 634 private PubFolder getPubFolder(IPath path) { |
| 606 if (pubFolders.size() == 0) { | 635 if (pubFolders.size() == 0) { |
| 607 return null; | 636 return null; |
| 608 } | 637 } |
| 609 for (int count = path.segmentCount() - 1; count >= 0; count--) { | 638 for (int count = path.segmentCount() - 1; count >= 0; count--) { |
| 610 PubFolder pubFolder = pubFolders.get(path.removeLastSegments(count)); | 639 PubFolder pubFolder = pubFolders.get(path.removeLastSegments(count)); |
| 611 if (pubFolder != null) { | 640 if (pubFolder != null) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 622 if (projectResourceLocation == null) { | 651 if (projectResourceLocation == null) { |
| 623 projectResourceLocation = projectResource.getLocation(); | 652 projectResourceLocation = projectResource.getLocation(); |
| 624 } | 653 } |
| 625 return projectResourceLocation; | 654 return projectResourceLocation; |
| 626 } | 655 } |
| 627 | 656 |
| 628 /** | 657 /** |
| 629 * Initialize the context for analyzing sources in the specified directory. Mu
st synchronize | 658 * Initialize the context for analyzing sources in the specified directory. Mu
st synchronize |
| 630 * against {@link #pubFolders} before calling this method and either call {@li
nk #initialize()} or | 659 * against {@link #pubFolders} before calling this method and either call {@li
nk #initialize()} or |
| 631 * check that {@link #isInitialized()} returns {@code true}. | 660 * check that {@link #isInitialized()} returns {@code true}. |
| 632 * | 661 * |
| 633 * @param context the context to be initialized (not {@code null}) | 662 * @param context the context to be initialized (not {@code null}) |
| 634 * @param container the container with sources to be analyzed | 663 * @param container the container with sources to be analyzed |
| 635 * @param sdk the Dart SDK to use when initializing the context (not {@code nu
ll}) | 664 * @param sdk the Dart SDK to use when initializing the context (not {@code nu
ll}) |
| 636 * @param hasPubspec {@code true} if the container has a pubspec file | 665 * @param hasPubspec {@code true} if the container has a pubspec file |
| 637 * @return the context (not {@code null}) | 666 * @return the context (not {@code null}) |
| 638 */ | 667 */ |
| 639 private AnalysisContext initContext(AnalysisContext context, IContainer contai
ner, DartSdk sdk, | 668 private AnalysisContext initContext( |
| 640 UriResolver pkgResolver) { | 669 AnalysisContext context, IContainer container, DartSdk sdk, UriResolver pk
gResolver) { |
| 641 DartUriResolver dartResolver = new DartUriResolver(sdk); | 670 DartUriResolver dartResolver = new DartUriResolver(sdk); |
| 642 | 671 |
| 643 FileUriResolver fileResolver = new FileUriResolver(); | 672 FileUriResolver fileResolver = new FileUriResolver(); |
| 644 | 673 |
| 645 SourceFactory sourceFactory; | 674 SourceFactory sourceFactory; |
| 646 | 675 |
| 647 if (pkgResolver != null) { | 676 if (pkgResolver != null) { |
| 648 sourceFactory = new SourceFactory(dartResolver, pkgResolver, fileResolver)
; | 677 sourceFactory = new SourceFactory(dartResolver, pkgResolver, fileResolver)
; |
| 649 } else { | 678 } else { |
| 650 logNoLocation(container); | 679 logNoLocation(container); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 665 | 694 |
| 666 /** | 695 /** |
| 667 * Initialize {@link #pubFolders} and {@link #defaultContext} if not already b
een initialized. | 696 * Initialize {@link #pubFolders} and {@link #defaultContext} if not already b
een initialized. |
| 668 * Must synchronize against {@link #pubFolders} before calling this method. | 697 * Must synchronize against {@link #pubFolders} before calling this method. |
| 669 */ | 698 */ |
| 670 private void initialize() { | 699 private void initialize() { |
| 671 if (isInitialized()) { | 700 if (isInitialized()) { |
| 672 return; | 701 return; |
| 673 } | 702 } |
| 674 boolean hasPubspec = projectResource.getFile(PUBSPEC_FILE_NAME).exists(); | 703 boolean hasPubspec = projectResource.getFile(PUBSPEC_FILE_NAME).exists(); |
| 704 defaultPackageResolver = getPackageUriResolver(projectResource, getSdk(), ha
sPubspec); |
| 675 defaultContext = initContext( | 705 defaultContext = initContext( |
| 676 factory.createContext(), | 706 factory.createContext(), |
| 677 projectResource, | 707 projectResource, |
| 678 getSdk(), | 708 getSdk(), |
| 679 getPackageUriResolver(projectResource, getSdk(), hasPubspec)); | 709 defaultPackageResolver); |
| 680 defaultResourceMap = new SimpleResourceMapImpl(projectResource, defaultConte
xt); | 710 defaultResourceMap = new SimpleResourceMapImpl(projectResource, defaultConte
xt); |
| 681 createPubFolders(projectResource); | 711 createPubFolders(projectResource); |
| 682 } | 712 } |
| 683 | 713 |
| 684 /** | 714 /** |
| 685 * Answer true if {@link #defaultContext} and {@link #pubFolders} have been in
itialized. Must | 715 * Answer true if {@link #defaultContext} and {@link #pubFolders} have been in
itialized. Must |
| 686 * synchronize against {@link #pubFolders} before calling this method. | 716 * synchronize against {@link #pubFolders} before calling this method. |
| 687 * | 717 * |
| 688 * @return {@code true} if initialized, else {@code false} | 718 * @return {@code true} if initialized, else {@code false} |
| 689 */ | 719 */ |
| 690 private boolean isInitialized() { | 720 private boolean isInitialized() { |
| 691 return defaultContext != null; | 721 return defaultContext != null; |
| 692 } | 722 } |
| 693 | 723 |
| 694 private void logNoLocation(IContainer container) { | 724 private void logNoLocation(IContainer container) { |
| 695 DartCore.logInformation("No location for " + container); | 725 DartCore.logInformation("No location for " + container); |
| 696 } | 726 } |
| 697 } | 727 } |
| OLD | NEW |