Lines 92-101
Link Here
|
92 |
import javax.tools.JavaFileObject; |
92 |
import javax.tools.JavaFileObject; |
93 |
import javax.tools.ToolProvider; |
93 |
import javax.tools.ToolProvider; |
94 |
import org.netbeans.api.java.classpath.ClassPath; |
94 |
import org.netbeans.api.java.classpath.ClassPath; |
|
|
95 |
import org.netbeans.api.java.lexer.JavaTokenId; |
95 |
import org.netbeans.api.java.platform.JavaPlatformManager; |
96 |
import org.netbeans.api.java.platform.JavaPlatformManager; |
96 |
import org.netbeans.api.java.queries.SourceLevelQuery; |
97 |
import org.netbeans.api.java.queries.SourceLevelQuery; |
97 |
import org.netbeans.api.java.source.ClasspathInfo.PathKind; |
98 |
import org.netbeans.api.java.source.ClasspathInfo.PathKind; |
98 |
import org.netbeans.api.java.source.ModificationResult.Difference; |
99 |
import org.netbeans.api.java.source.ModificationResult.Difference; |
|
|
100 |
import org.netbeans.api.lexer.Language; |
101 |
import org.netbeans.api.timers.TimesCollector; |
99 |
import org.netbeans.editor.Registry; |
102 |
import org.netbeans.editor.Registry; |
100 |
import org.netbeans.modules.java.source.JavaFileFilterQuery; |
103 |
import org.netbeans.modules.java.source.JavaFileFilterQuery; |
101 |
import org.netbeans.modules.java.source.builder.ASTService; |
104 |
import org.netbeans.modules.java.source.builder.ASTService; |
Lines 106-111
Link Here
|
106 |
import org.netbeans.modules.java.source.engine.RootTree; |
109 |
import org.netbeans.modules.java.source.engine.RootTree; |
107 |
import org.netbeans.modules.java.source.parsing.FileObjects; |
110 |
import org.netbeans.modules.java.source.parsing.FileObjects; |
108 |
import org.netbeans.modules.java.preprocessorbridge.spi.JavaFileFilterImplementation; |
111 |
import org.netbeans.modules.java.preprocessorbridge.spi.JavaFileFilterImplementation; |
|
|
112 |
import org.netbeans.modules.java.preprocessorbridge.spi.JavaSourceProvider; |
109 |
import org.netbeans.modules.java.source.TreeLoader; |
113 |
import org.netbeans.modules.java.source.TreeLoader; |
110 |
import org.netbeans.modules.java.source.builder.DefaultEnvironment; |
114 |
import org.netbeans.modules.java.source.builder.DefaultEnvironment; |
111 |
import org.netbeans.modules.java.source.tasklist.CompilerSettings; |
115 |
import org.netbeans.modules.java.source.tasklist.CompilerSettings; |
Lines 130-135
Link Here
|
130 |
import org.openide.loaders.DataObjectNotFoundException; |
134 |
import org.openide.loaders.DataObjectNotFoundException; |
131 |
import org.openide.modules.SpecificationVersion; |
135 |
import org.openide.modules.SpecificationVersion; |
132 |
import org.openide.util.Exceptions; |
136 |
import org.openide.util.Exceptions; |
|
|
137 |
import org.openide.util.Lookup; |
133 |
import org.openide.util.NbBundle; |
138 |
import org.openide.util.NbBundle; |
134 |
import org.openide.util.RequestProcessor; |
139 |
import org.openide.util.RequestProcessor; |
135 |
import org.openide.util.WeakListeners; |
140 |
import org.openide.util.WeakListeners; |
Lines 280-285
Link Here
|
280 |
//Preprocessor support |
285 |
//Preprocessor support |
281 |
private FilterListener filterListener; |
286 |
private FilterListener filterListener; |
282 |
|
287 |
|
|
|
288 |
private PositionConverter binding; |
289 |
|
283 |
private static final Logger LOGGER = Logger.getLogger(JavaSource.class.getName()); |
290 |
private static final Logger LOGGER = Logger.getLogger(JavaSource.class.getName()); |
284 |
|
291 |
|
285 |
static { |
292 |
static { |
Lines 299-312
Link Here
|
299 |
if (files == null || cpInfo == null) { |
306 |
if (files == null || cpInfo == null) { |
300 |
throw new IllegalArgumentException (); |
307 |
throw new IllegalArgumentException (); |
301 |
} |
308 |
} |
302 |
try { |
309 |
return create(cpInfo, null, files); |
303 |
return new JavaSource(cpInfo, files); |
|
|
304 |
} catch (DataObjectNotFoundException donf) { |
305 |
LOGGER.warning("Ignoring non existent file: " + FileUtil.getFileDisplayName(donf.getFileObject())); //NOI18N |
306 |
} catch (IOException ex) { |
307 |
Exceptions.printStackTrace(ex); |
308 |
} |
309 |
return null; |
310 |
} |
310 |
} |
311 |
|
311 |
|
312 |
|
312 |
|
Lines 322-328
Link Here
|
322 |
if (files == null || cpInfo == null) { |
322 |
if (files == null || cpInfo == null) { |
323 |
throw new IllegalArgumentException (); |
323 |
throw new IllegalArgumentException (); |
324 |
} |
324 |
} |
325 |
return create(cpInfo, Arrays.asList(files)); |
325 |
return create(cpInfo, null, Arrays.asList(files)); |
|
|
326 |
} |
327 |
|
328 |
private static JavaSource create(final ClasspathInfo cpInfo, final PositionConverter binding, final Collection<? extends FileObject> files) throws IllegalArgumentException { |
329 |
try { |
330 |
return new JavaSource(cpInfo, binding, files); |
331 |
} catch (DataObjectNotFoundException donf) { |
332 |
Logger.getLogger("global").warning("Ignoring non existent file: " + FileUtil.getFileDisplayName(donf.getFileObject())); //NOI18N |
333 |
} catch (IOException ex) { |
334 |
Exceptions.printStackTrace(ex); |
335 |
} |
336 |
return null; |
326 |
} |
337 |
} |
327 |
|
338 |
|
328 |
private static Map<FileObject, Reference<JavaSource>> file2JavaSource = new WeakHashMap<FileObject, Reference<JavaSource>>(); |
339 |
private static Map<FileObject, Reference<JavaSource>> file2JavaSource = new WeakHashMap<FileObject, Reference<JavaSource>>(); |
Lines 341-383
Link Here
|
341 |
if (!fileObject.isValid()) { |
352 |
if (!fileObject.isValid()) { |
342 |
return null; |
353 |
return null; |
343 |
} |
354 |
} |
344 |
if ("text/x-java".equals(FileUtil.getMIMEType(fileObject)) || "java".equals(fileObject.getExt())) { //NOI18N |
355 |
|
345 |
Reference<JavaSource> ref = file2JavaSource.get(fileObject); |
356 |
Reference<JavaSource> ref = file2JavaSource.get(fileObject); |
346 |
JavaSource js = ref != null ? ref.get() : null; |
357 |
JavaSource js = ref != null ? ref.get() : null; |
347 |
if (js == null) { |
358 |
if (js == null) { |
348 |
file2JavaSource.put(fileObject, new WeakReference<JavaSource>(js = create(ClasspathInfo.create(fileObject), fileObject))); |
359 |
if ("application/x-class-file".equals(FileUtil.getMIMEType(fileObject)) || "class".equals(fileObject.getExt())) { //NOI18N |
349 |
} |
360 |
ClassPath bootPath = ClassPath.getClassPath(fileObject, ClassPath.BOOT); |
350 |
return js; |
361 |
ClassPath compilePath = ClassPath.getClassPath(fileObject, ClassPath.COMPILE); |
351 |
} |
362 |
if (compilePath == null) { |
352 |
if ("application/x-class-file".equals(FileUtil.getMIMEType(fileObject)) || "class".equals(fileObject.getExt())) { //NOI18N |
363 |
compilePath = ClassPathSupport.createClassPath(new URL[0]); |
353 |
ClassPath bootPath = ClassPath.getClassPath(fileObject, ClassPath.BOOT); |
364 |
} |
354 |
ClassPath compilePath = ClassPath.getClassPath(fileObject, ClassPath.COMPILE); |
365 |
ClassPath srcPath = ClassPath.getClassPath(fileObject, ClassPath.SOURCE); |
355 |
if (compilePath == null) { |
366 |
if (srcPath == null) { |
356 |
compilePath = ClassPathSupport.createClassPath(new URL[0]); |
367 |
srcPath = ClassPathSupport.createClassPath(new URL[0]); |
357 |
} |
368 |
} |
358 |
ClassPath srcPath = ClassPath.getClassPath(fileObject, ClassPath.SOURCE); |
369 |
ClassPath execPath = ClassPath.getClassPath(fileObject, ClassPath.EXECUTE); |
359 |
if (srcPath == null) { |
370 |
if (execPath != null) { |
360 |
srcPath = ClassPathSupport.createClassPath(new URL[0]); |
371 |
bootPath = ClassPathSupport.createProxyClassPath(execPath, bootPath); |
361 |
} |
372 |
} |
362 |
ClassPath execPath = ClassPath.getClassPath(fileObject, ClassPath.EXECUTE); |
373 |
final ClasspathInfo info = ClasspathInfo.create(bootPath, compilePath, srcPath); |
363 |
if (execPath != null) { |
374 |
FileObject root = ClassPathSupport.createProxyClassPath(bootPath,compilePath,srcPath).findOwnerRoot(fileObject); |
364 |
bootPath = ClassPathSupport.createProxyClassPath(execPath, bootPath); |
375 |
try { |
|
|
376 |
js = new JavaSource (info,fileObject,root); |
377 |
} catch (IOException ioe) { |
378 |
Exceptions.printStackTrace(ioe); |
379 |
} |
380 |
} else { |
381 |
PositionConverter binding = null; |
382 |
if (!"text/x-java".equals(FileUtil.getMIMEType(fileObject)) && !"java".equals(fileObject.getExt())) { //NOI18N |
383 |
for (JavaSourceProvider provider : Lookup.getDefault().lookupAll(JavaSourceProvider.class)) { |
384 |
JavaFileFilterImplementation filter = provider.forFileObject(fileObject); |
385 |
if (filter != null) { |
386 |
binding = new PositionConverter(fileObject, filter); |
387 |
break; |
388 |
} |
389 |
} |
390 |
if (binding == null) |
391 |
return null; |
365 |
} |
392 |
} |
366 |
final ClasspathInfo info = ClasspathInfo.create(bootPath, compilePath, srcPath); |
393 |
js = create(ClasspathInfo.create(fileObject), binding, Collections.singletonList(fileObject)); |
367 |
FileObject root = ClassPathSupport.createProxyClassPath(bootPath,compilePath,srcPath).findOwnerRoot(fileObject); |
|
|
368 |
try { |
369 |
return new JavaSource (info,fileObject,root); |
370 |
} catch (IOException ioe) { |
371 |
Exceptions.printStackTrace(ioe); |
372 |
} |
394 |
} |
|
|
395 |
file2JavaSource.put(fileObject, new WeakReference<JavaSource>(js)); |
373 |
} |
396 |
} |
374 |
return null; |
397 |
return js; |
375 |
} |
398 |
} |
376 |
|
399 |
|
377 |
/** |
400 |
/** |
378 |
* Returns a {@link JavaSource} instance associated to {@link org.openide.filesystems.FileObject} |
401 |
* Returns a {@link JavaSource} instance associated to the given {@link javax.swing.Document}, |
379 |
* the {@link Document} was created from, it returns null if the {@link Document} is not |
402 |
* it returns null if the {@link Document} is not |
380 |
* associanted with data type providing the {@link JavaSource}. |
403 |
* associated with data type providing the {@link JavaSource}. |
381 |
* @param doc {@link Document} for which the {@link JavaSource} should be found/created. |
404 |
* @param doc {@link Document} for which the {@link JavaSource} should be found/created. |
382 |
* @return {@link JavaSource} or null |
405 |
* @return {@link JavaSource} or null |
383 |
* @throws {@link IllegalArgumentException} if doc is null |
406 |
* @throws {@link IllegalArgumentException} if doc is null |
Lines 386-393
Link Here
|
386 |
if (doc == null) { |
409 |
if (doc == null) { |
387 |
throw new IllegalArgumentException ("doc == null"); //NOI18N |
410 |
throw new IllegalArgumentException ("doc == null"); //NOI18N |
388 |
} |
411 |
} |
389 |
Reference<?> ref = (Reference<?>) doc.getProperty(JavaSource.class); |
412 |
JavaSource js = (JavaSource)doc.getProperty(JavaSource.class); |
390 |
JavaSource js = ref != null ? (JavaSource) ref.get() : null; |
|
|
391 |
if (js == null) { |
413 |
if (js == null) { |
392 |
DataObject dObj = (DataObject)doc.getProperty(Document.StreamDescriptionProperty); |
414 |
DataObject dObj = (DataObject)doc.getProperty(Document.StreamDescriptionProperty); |
393 |
if (dObj != null) |
415 |
if (dObj != null) |
Lines 401-410
Link Here
|
401 |
* @param files to create JavaSource for |
423 |
* @param files to create JavaSource for |
402 |
* @param cpInfo classpath info |
424 |
* @param cpInfo classpath info |
403 |
*/ |
425 |
*/ |
404 |
private JavaSource (ClasspathInfo cpInfo, Collection<? extends FileObject> files) throws IOException { |
426 |
private JavaSource (ClasspathInfo cpInfo, PositionConverter binding, Collection<? extends FileObject> files) throws IOException { |
405 |
this.reparseDelay = REPARSE_DELAY; |
427 |
this.reparseDelay = REPARSE_DELAY; |
406 |
this.files = Collections.unmodifiableList(new ArrayList<FileObject>(files)); //Create a defensive copy, prevent modification |
428 |
this.files = Collections.unmodifiableList(new ArrayList<FileObject>(files)); //Create a defensive copy, prevent modification |
407 |
this.fileChangeListener = new FileChangeListenerImpl (); |
429 |
this.fileChangeListener = new FileChangeListenerImpl (); |
|
|
430 |
this.binding = binding; |
408 |
boolean multipleSources = this.files.size() > 1, filterAssigned = false; |
431 |
boolean multipleSources = this.files.size() > 1, filterAssigned = false; |
409 |
for (Iterator<? extends FileObject> it = this.files.iterator(); it.hasNext();) { |
432 |
for (Iterator<? extends FileObject> it = this.files.iterator(); it.hasNext();) { |
410 |
FileObject file = it.next(); |
433 |
FileObject file = it.next(); |
Lines 418-424
Link Here
|
418 |
} |
441 |
} |
419 |
if (!filterAssigned) { |
442 |
if (!filterAssigned) { |
420 |
filterAssigned = true; |
443 |
filterAssigned = true; |
421 |
JavaFileFilterImplementation filter = JavaFileFilterQuery.getFilter(file); |
444 |
if (this.binding == null) { |
|
|
445 |
this.binding = new PositionConverter(file, JavaFileFilterQuery.getFilter(file)); |
446 |
} |
447 |
JavaFileFilterImplementation filter = this.binding.getFilter(); |
422 |
if (filter != null) { |
448 |
if (filter != null) { |
423 |
this.filterListener = new FilterListener (filter); |
449 |
this.filterListener = new FilterListener (filter); |
424 |
} |
450 |
} |
Lines 433-439
Link Here
|
433 |
} |
459 |
} |
434 |
} |
460 |
} |
435 |
} |
461 |
} |
436 |
this.classpathInfo = cpInfo; |
462 |
this.classpathInfo = cpInfo; |
437 |
if (this.files.size() == 1) { |
463 |
if (this.files.size() == 1) { |
438 |
this.rootFo = classpathInfo.getClassPath(PathKind.SOURCE).findOwnerRoot(this.files.iterator().next()); |
464 |
this.rootFo = classpathInfo.getClassPath(PathKind.SOURCE).findOwnerRoot(this.files.iterator().next()); |
439 |
} |
465 |
} |
Lines 486-492
Link Here
|
486 |
assert !holdsDocumentWriteLock(files) : "JavaSource.runCompileControlTask called under Document write lock."; //NOI18N |
512 |
assert !holdsDocumentWriteLock(files) : "JavaSource.runCompileControlTask called under Document write lock."; //NOI18N |
487 |
|
513 |
|
488 |
boolean a = false; |
514 |
boolean a = false; |
489 |
assert a = true; |
515 |
assert a = true; |
490 |
if (a && javax.swing.SwingUtilities.isEventDispatchThread()) { |
516 |
if (a && javax.swing.SwingUtilities.isEventDispatchThread()) { |
491 |
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[2]; |
517 |
StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[2]; |
492 |
if (warnedAboutRunInEQ.add(stackTraceElement)) { |
518 |
if (warnedAboutRunInEQ.add(stackTraceElement)) { |
Lines 512-518
Link Here
|
512 |
} |
538 |
} |
513 |
} |
539 |
} |
514 |
if (currentInfo == null) { |
540 |
if (currentInfo == null) { |
515 |
currentInfo = createCurrentInfo(this,this.files.isEmpty() ? null : this.files.iterator().next(), filterListener, null); |
541 |
currentInfo = createCurrentInfo(this, binding, null); |
516 |
if (shared) { |
542 |
if (shared) { |
517 |
synchronized (this) { |
543 |
synchronized (this) { |
518 |
if (this.currentInfo == null || (this.flags & INVALID) != 0) { |
544 |
if (this.currentInfo == null || (this.flags & INVALID) != 0) { |
Lines 581-587
Link Here
|
581 |
else { |
607 |
else { |
582 |
restarted = true; |
608 |
restarted = true; |
583 |
} |
609 |
} |
584 |
CompilationInfo ci = createCurrentInfo(this,activeFile,filterListener,jt); |
610 |
CompilationInfo ci = createCurrentInfo(this, new PositionConverter(activeFile, null), jt); |
585 |
task.run(new CompilationController(ci)); |
611 |
task.run(new CompilationController(ci)); |
586 |
if (!ci.needsRestart) { |
612 |
if (!ci.needsRestart) { |
587 |
jt = ci.getJavacTask(); |
613 |
jt = ci.getJavacTask(); |
Lines 732-738
Link Here
|
732 |
} |
758 |
} |
733 |
} |
759 |
} |
734 |
if (currentInfo == null) { |
760 |
if (currentInfo == null) { |
735 |
currentInfo = createCurrentInfo(this,this.files.isEmpty() ? null : this.files.iterator().next(), filterListener, null); |
761 |
currentInfo = createCurrentInfo(this, binding, null); |
736 |
synchronized (this) { |
762 |
synchronized (this) { |
737 |
if (this.currentInfo == null || (this.flags & INVALID) != 0) { |
763 |
if (this.currentInfo == null || (this.flags & INVALID) != 0) { |
738 |
this.currentInfo = currentInfo; |
764 |
this.currentInfo = currentInfo; |
Lines 791-797
Link Here
|
791 |
else { |
817 |
else { |
792 |
restarted = true; |
818 |
restarted = true; |
793 |
} |
819 |
} |
794 |
CompilationInfo ci = createCurrentInfo(this,activeFile, filterListener, jt); |
820 |
CompilationInfo ci = createCurrentInfo(this, new PositionConverter(activeFile, null), jt); |
795 |
WorkingCopy copy = new WorkingCopy(ci); |
821 |
WorkingCopy copy = new WorkingCopy(ci); |
796 |
task.run(copy); |
822 |
task.run(copy); |
797 |
if (!ci.needsRestart) { |
823 |
if (!ci.needsRestart) { |
Lines 864-870
Link Here
|
864 |
currentInfo = this.currentInfo; |
890 |
currentInfo = this.currentInfo; |
865 |
} |
891 |
} |
866 |
if (currentInfo == null) { |
892 |
if (currentInfo == null) { |
867 |
currentInfo = createCurrentInfo (this, this.files.isEmpty() ? null : this.files.iterator().next(), filterListener, null); |
893 |
currentInfo = createCurrentInfo (this, binding, null); |
868 |
} |
894 |
} |
869 |
synchronized (this) { |
895 |
synchronized (this) { |
870 |
if (this.currentInfo == null) { |
896 |
if (this.currentInfo == null) { |
Lines 1407-1413
Link Here
|
1407 |
try { |
1433 |
try { |
1408 |
//createCurrentInfo has to be out of synchronized block, it aquires an editor lock |
1434 |
//createCurrentInfo has to be out of synchronized block, it aquires an editor lock |
1409 |
if (jsInvalid) { |
1435 |
if (jsInvalid) { |
1410 |
ci = createCurrentInfo (js,js.files.isEmpty() ? null : js.files.iterator().next(), js.filterListener, null); |
1436 |
ci = createCurrentInfo (js, js.binding, null); |
1411 |
synchronized (js) { |
1437 |
synchronized (js) { |
1412 |
if ((js.flags & INVALID) != 0) { |
1438 |
if ((js.flags & INVALID) != 0) { |
1413 |
js.currentInfo = ci; |
1439 |
js.currentInfo = ci; |
Lines 1715-1725
Link Here
|
1715 |
|
1741 |
|
1716 |
private final class FilterListener implements ChangeListener { |
1742 |
private final class FilterListener implements ChangeListener { |
1717 |
|
1743 |
|
1718 |
private final JavaFileFilterImplementation filter; |
|
|
1719 |
|
1720 |
public FilterListener (final JavaFileFilterImplementation filter) { |
1744 |
public FilterListener (final JavaFileFilterImplementation filter) { |
1721 |
this.filter = filter; |
1745 |
filter.addChangeListener(WeakListeners.change(this, filter)); |
1722 |
this.filter.addChangeListener(WeakListeners.change(this, this.filter)); |
|
|
1723 |
} |
1746 |
} |
1724 |
|
1747 |
|
1725 |
public void stateChanged(ChangeEvent event) { |
1748 |
public void stateChanged(ChangeEvent event) { |
Lines 1727-1736
Link Here
|
1727 |
} |
1750 |
} |
1728 |
} |
1751 |
} |
1729 |
|
1752 |
|
1730 |
private static CompilationInfo createCurrentInfo (final JavaSource js, final FileObject fo, final FilterListener filterListener, final JavacTaskImpl javac) throws IOException { |
1753 |
private static CompilationInfo createCurrentInfo (final JavaSource js, final PositionConverter binding, final JavacTaskImpl javac) throws IOException { |
1731 |
CompilationInfo info = new CompilationInfo (js, fo, filterListener == null ? null : filterListener.filter, javac); |
1754 |
CompilationInfo info = new CompilationInfo (js, binding, javac); |
1732 |
Logger.getLogger("TIMER").log(Level.FINE, "CompilationInfo", |
1755 |
if (binding != null) { |
1733 |
new Object[] {fo, info}); |
1756 |
Logger.getLogger("TIMER").log(Level.FINE, "CompilationInfo", |
|
|
1757 |
new Object[] {binding.getFileObject(), info}); |
1758 |
} |
1734 |
return info; |
1759 |
return info; |
1735 |
} |
1760 |
} |
1736 |
|
1761 |
|
Lines 1814-1819
Link Here
|
1814 |
public boolean isDispatchThread () { |
1839 |
public boolean isDispatchThread () { |
1815 |
return factory.isDispatchThread(Thread.currentThread()); |
1840 |
return factory.isDispatchThread(Thread.currentThread()); |
1816 |
} |
1841 |
} |
|
|
1842 |
|
1843 |
public JavaSource create(ClasspathInfo cpInfo, PositionConverter binding, Collection<? extends FileObject> files) throws IllegalArgumentException { |
1844 |
return JavaSource.create(cpInfo, binding, files); |
1845 |
} |
1846 |
|
1847 |
public PositionConverter create(FileObject fo, int offset, int length, JTextComponent component) { |
1848 |
return new PositionConverter(fo, offset, length, component); |
1849 |
} |
1817 |
} |
1850 |
} |
1818 |
|
1851 |
|
1819 |
|
1852 |
|
Lines 2179-2185
Link Here
|
2179 |
String dumpDir = System.getProperty("netbeans.user") + "/var/log/"; //NOI18N |
2212 |
String dumpDir = System.getProperty("netbeans.user") + "/var/log/"; //NOI18N |
2180 |
String src = info.getText(); |
2213 |
String src = info.getText(); |
2181 |
FileObject file = info.getFileObject(); |
2214 |
FileObject file = info.getFileObject(); |
2182 |
String fileName = FileUtil.getFileDisplayName(info.getFileObject()); |
2215 |
String fileName = FileUtil.getFileDisplayName(file); |
2183 |
String origName = file.getName(); |
2216 |
String origName = file.getName(); |
2184 |
File f = new File(dumpDir + origName + ".dump"); // NOI18N |
2217 |
File f = new File(dumpDir + origName + ".dump"); // NOI18N |
2185 |
boolean dumpSucceeded = false; |
2218 |
boolean dumpSucceeded = false; |