Bug 114091

Summary: [assist][javadoc] eternal loop
Product: [Eclipse Project] JDT Reporter: Tom Hofmann <eclipse>
Component: CoreAssignee: Frederic Fusier <frederic_fusier>
Status: VERIFIED FIXED QA Contact:
Severity: critical    
Priority: P3    
Version: 3.2   
Target Milestone: 3.2 M3   
Hardware: PC   
OS: All   
Whiteboard:
Attachments:
Description Flags
vm_dump.txt
none
TreeLineTracker.java none

Description Tom Hofmann CLA 2005-10-28 08:29:01 EDT
I20051025-0800-gtk

I used code assist in javadoc, then suddenly CPU went to 100% and the main
thread never returned from code completion. Thread dumps all looked similar to
the one below. 

I will attach the file I was working on as well as the full vm dump.

"main" prio=1 tid=0x082e8d30 nid=0x3f67 runnable [0xbfd6f000..0xbfd704a8]
	at java.lang.Character.isJavaIdentifierStart(Character.java:3652)
	at
org.eclipse.jdt.internal.codeassist.complete.CompletionScanner.getNextToken(CompletionScanner.java:150)
	at
org.eclipse.jdt.internal.compiler.parser.AbstractCommentParser.readToken(AbstractCommentParser.java:1278)
	at
org.eclipse.jdt.internal.compiler.parser.AbstractCommentParser.readTokenAndConsume(AbstractCommentParser.java:1292)
	at
org.eclipse.jdt.internal.compiler.parser.JavadocParser.parseTag(JavadocParser.java:447)
	at
org.eclipse.jdt.internal.codeassist.complete.CompletionJavadocParser.parseTag(CompletionJavadocParser.java:542)
	at
org.eclipse.jdt.internal.compiler.parser.AbstractCommentParser.commentParse(AbstractCommentParser.java:207)
	at
org.eclipse.jdt.internal.codeassist.complete.CompletionJavadocParser.commentParse(CompletionJavadocParser.java:89)
	at
org.eclipse.jdt.internal.compiler.parser.JavadocParser.checkDeprecation(JavadocParser.java:75)
	at
org.eclipse.jdt.internal.codeassist.complete.CompletionJavadocParser.checkDeprecation(CompletionJavadocParser.java:77)
	at org.eclipse.jdt.internal.compiler.parser.Parser.checkComment(Parser.java:890)
	at
org.eclipse.jdt.internal.compiler.parser.Parser.consumeModifiers(Parser.java:4140)
	at
org.eclipse.jdt.internal.codeassist.complete.CompletionParser.consumeModifiers(CompletionParser.java:2302)
	at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:5570)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:8493)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:8663)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:8628)
	at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:7421)
	at
org.eclipse.jdt.internal.codeassist.complete.CompletionParser.dietParse(CompletionParser.java:3146)
	at
org.eclipse.jdt.internal.codeassist.CompletionEngine.complete(CompletionEngine.java:1541)
	at org.eclipse.jdt.internal.core.Openable.codeComplete(Openable.java:127)
	at
org.eclipse.jdt.internal.core.CompilationUnit.codeComplete(CompilationUnit.java:290)
	at
org.eclipse.jdt.internal.core.CompilationUnit.codeComplete(CompilationUnit.java:283)
	at
org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer.internalComputeCompletionProposals(JavaCompletionProposalComputer.java:211)
	at
org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer.computeCompletionProposals(JavaCompletionProposalComputer.java:191)
	at
org.eclipse.jdt.internal.ui.text.java.CompletionProposalComputerDescriptor.computeCompletionProposals(CompletionProposalComputerDescriptor.java:278)
	at
org.eclipse.jdt.internal.ui.text.java.CompletionProposalCategory.computeCompletionProposals(CompletionProposalCategory.java:248)
	at
org.eclipse.jdt.internal.ui.text.java.ContentAssistProcessor.collectProposals(ContentAssistProcessor.java:158)
	at
org.eclipse.jdt.internal.ui.text.java.ContentAssistProcessor.computeCompletionProposals(ContentAssistProcessor.java:143)
	at
org.eclipse.jface.text.contentassist.ContentAssistant.computeCompletionProposals(ContentAssistant.java:1566)
	at
org.eclipse.jface.text.contentassist.CompletionProposalPopup.computeProposals(CompletionProposalPopup.java:447)
	at
org.eclipse.jface.text.contentassist.CompletionProposalPopup.access$15(CompletionProposalPopup.java:444)
	at
org.eclipse.jface.text.contentassist.CompletionProposalPopup$2.run(CompletionProposalPopup.java:379)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
	at
org.eclipse.jface.text.contentassist.CompletionProposalPopup.showProposals(CompletionProposalPopup.java:373)
	at
org.eclipse.jface.text.contentassist.ContentAssistant$2.run(ContentAssistant.java:335)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
	- locked <0x8f2a0060> (a org.eclipse.swt.widgets.RunnableLock)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3037)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2745)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1763)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1727)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:371)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:143)
	at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:106)
	at
org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:226)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:375)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:164)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.eclipse.core.launcher.Main.invokeFramework(Main.java:338)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:282)
	at org.eclipse.core.launcher.Main.run(Main.java:977)
	at org.eclipse.core.launcher.Main.main(Main.java:952)
Comment 1 Tom Hofmann CLA 2005-10-28 08:30:39 EDT
Created attachment 28915 [details]
vm_dump.txt

A vm dump at the time that code assist was gone in a neverending loop. Slightly
different main thread stack than the stack in comment 0, but similar.
Comment 2 Tom Hofmann CLA 2005-10-28 08:54:33 EDT
Created attachment 28916 [details]
TreeLineTracker.java

File that shows the behavior. Steps to reproduce:

- enable auto-activation, set '@' as autoactivation character for Javadoc
assist
- open the cu in the Java editor (preferably within the org.eclipse.text
project)
- go to the javadoc comment of the field 'offset_hint'. I reads:

	/**
	 * The line offset of the line last queried with
<code>node_by_offset</code>.
	 */

- delete the reference to node_by_offset, including the surrounding <code> tag
- at the same location, we want to insert a @link reference to the
node_by_offset method:
  - type {
  - type @

> boom - the completion engine never returns
Comment 3 Frederic Fusier CLA 2005-10-28 14:00:08 EDT
Problem comes from a potential issue in CompletionScanner (see bug 114115).
However, it's a little bit dangerous to change this behavior few days before 3.2
M3 delivery...

So, I'll fix it temporarily in CompletionJavadocParser by overriding
readTokenAndConsume() method to avoid this kind of issue but will remove it as
soon as bug 114115 will be fixed...

Test cases added in JavadocCompletionParserTest
Comment 4 David Audel CLA 2005-10-31 06:30:14 EST
Verified for 3.2 M3 using build I20051031-0010