Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 231241 Details for
Bug 333428
[content assist] Creating an anonymous inner class doesn't add a semicolon to enclosing method invocation
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Patch with testcases.
eclipse.jdt.ui.210513.patch (text/plain), 24.63 KB, created by
Martin Mathew
on 2013-05-21 06:47:20 EDT
(
hide
)
Description:
Patch with testcases.
Filename:
MIME Type:
Creator:
Martin Mathew
Created:
2013-05-21 06:47:20 EDT
Size:
24.63 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jdt.text.tests >diff --git src/org/eclipse/jdt/text/tests/contentassist/CodeCompletionTest.java src/org/eclipse/jdt/text/tests/contentassist/CodeCompletionTest.java >index 7accf33..d2b4926 100644 >--- src/org/eclipse/jdt/text/tests/contentassist/CodeCompletionTest.java >+++ src/org/eclipse/jdt/text/tests/contentassist/CodeCompletionTest.java >@@ -154,19 +154,21 @@ > buf.append("package test1;\n"); > buf.append("public class A {\n"); > buf.append(" public void foo() {\n"); >- buf.append(" Runnable run= new Runnable(\n"); >+ buf.append(" Runnable run= new Run\n"); > buf.append(" }\n"); >+ buf.append(" public void bar() {}\n"); > buf.append("}\n"); > String contents= buf.toString(); > > ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); > >- String str= "Runnable run= new Runnable("; >+ String str= "Runnable run= new Run"; > > int offset= contents.indexOf(str) + str.length(); > > CompletionProposalCollector collector= createCollector(cu, offset); > collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); > > codeComplete(cu, offset, collector); > >@@ -190,6 +192,7 @@ > " }\n" + > " };\n" + > " }\n" + >+ " public void bar() {}\n" + > "}\n" + > ""); > assertEquals(buf.toString(), doc.get()); >@@ -457,6 +460,451 @@ > assertEquals(buf.toString(), doc.get()); > } > >+ public void testAnonymousTypeCompletion7() throws Exception { >+ // bug 333428#c0 => button.addSelectionListener(new SelectionL >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runn\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "foo(new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" });\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ >+ public void testAnonymousTypeCompletion8() throws Exception { >+ // bug 333428#c0 => button.addSelectionListener(new SelectionL) >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runn)\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "foo(new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" });\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ >+ >+ public void testAnonymousTypeCompletion9() throws Exception { >+ // bug 333428#c0 => button.addSelectionListener(new SelectionL); >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runn);\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "foo(new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" });\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ >+ public void testAnonymousTypeCompletion10() throws Exception { >+ /* bug 357480#c0 >+ class A { >+ private Runnable jobs[] = { >+ new Run| >+ }; >+ } >+ */ >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {\n"); >+ buf.append(" new Runn\n"); >+ buf.append(" };\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {\n"); >+ buf.append(" new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" }\n"); >+ buf.append(" };\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ >+ public void testAnonymousTypeCompletion11() throws Exception { >+ /* bug 357480#c0 >+ class A { >+ private Runnable jobs[] = { >+ new Run| >+ } >+ } >+ */ >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {\n"); >+ buf.append(" new Runn\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {\n"); >+ buf.append(" new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" }\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ >+ public void testAnonymousTypeCompletion12() throws Exception { >+ /* bug 357480#c0 >+ class A { >+ private Runnable jobs[] = { >+ new Run| >+ } >+ public void m1(){} >+ } >+ */ >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {\n"); >+ buf.append(" new Runn\n"); >+ buf.append(" }\n"); >+ buf.append(" public void m1(){}\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {\n"); >+ buf.append(" new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" }\n"); >+ buf.append(" }\n"); >+ buf.append(" public void m1(){}\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ >+ public void testAnonymousTypeCompletion13() throws Exception { >+ /* bug 357480#c0 >+ class A { >+ private Runnable jobs[] = {new Run} >+ } >+ */ >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {new Runn}\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" private Runnable jobs[] = {new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" }};\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ >+ public void testAnonymousTypeCompletion14() throws Exception { >+ /* >+ private void m1(Button b){ >+ foo(new Runn|) >+ System.out.println(); >+ } >+ */ >+ IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); >+ >+ IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runn)\n"); >+ buf.append(" System.out.println();\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ String contents= buf.toString(); >+ >+ ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null); >+ >+ String str= "foo(new Runn"; >+ >+ int offset= contents.indexOf(str) + str.length(); >+ >+ CompletionProposalCollector collector= createCollector(cu, offset); >+ collector.setReplacementLength(0); >+ collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true); >+ >+ codeComplete(cu, offset, collector); >+ >+ IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals(); >+ >+ assertNumberOf("proposals", proposals.length, 1); >+ >+ IDocument doc= new Document(contents); >+ >+ proposals[0].apply(doc); >+ >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class A {\n"); >+ buf.append(" public void foo(Runnable r) {\n"); >+ buf.append(" }\n"); >+ buf.append(" public void bar() {\n"); >+ buf.append(" foo(new Runnable() {\n"); >+ buf.append(" \n"); >+ buf.append(" public void run() {\n"); >+ buf.append(" //TODO\n"); >+ buf.append(" \n"); >+ buf.append(" }\n"); >+ buf.append(" });\n"); >+ buf.append(" System.out.println();\n"); >+ buf.append(" }\n"); >+ buf.append("}\n"); >+ assertEquals(buf.toString(), doc.get()); >+ } >+ > public void testAnonymousTypeCompletionBug280801() throws Exception { > IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src"); > >@@ -595,7 +1043,7 @@ > buf.append(" //TODO\n"); > buf.append(" \n"); > buf.append(" }\n"); >- buf.append(" })\n"); >+ buf.append(" });\n"); > buf.append(" }\n"); > buf.append("}\n"); > assertEquals("", buf.toString(), doc.get()); >#P org.eclipse.jdt.ui >diff --git ui/org/eclipse/jdt/internal/ui/text/java/AnonymousTypeCompletionProposal.java ui/org/eclipse/jdt/internal/ui/text/java/AnonymousTypeCompletionProposal.java >index 6be59bd..baf41c6 100644 >--- ui/org/eclipse/jdt/internal/ui/text/java/AnonymousTypeCompletionProposal.java >+++ ui/org/eclipse/jdt/internal/ui/text/java/AnonymousTypeCompletionProposal.java >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2000, 2011 IBM Corporation and others. >+ * Copyright (c) 2000, 2013 IBM Corporation and others. > * All rights reserved. This program and the accompanying materials > * are made available under the terms of the Eclipse Public License v1.0 > * which accompanies this distribution, and is available at >@@ -43,6 +43,7 @@ > import org.eclipse.jdt.core.JavaCore; > import org.eclipse.jdt.core.JavaModelException; > import org.eclipse.jdt.core.Signature; >+import org.eclipse.jdt.core.compiler.IProblem; > import org.eclipse.jdt.core.dom.ASTNode; > import org.eclipse.jdt.core.dom.ASTParser; > import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; >@@ -71,6 +72,7 @@ > import org.eclipse.jdt.internal.ui.dialogs.OverrideMethodDialog; > import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider; > import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings; >+import org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner; > > > public class AnonymousTypeCompletionProposal extends JavaTypeCompletionProposal implements ICompletionProposalExtension4 { >@@ -82,7 +84,9 @@ > private int fContextInformationPosition; > > private ImportRewrite fImportRewrite; >- >+ >+ private final String SEMICOLON= ";"; //$NON-NLS-1$ >+ private final String ESCAPE_CHAR= "\r"; //$NON-NLS-1$ > > public AnonymousTypeCompletionProposal(IJavaProject jproject, ICompilationUnit cu, JavaContentAssistInvocationContext invocationContext, int start, int length, String constructorCompletion, StyledString displayName, String declarationSignature, IType superType, int relevance) { > super(constructorCompletion, cu, start, length, null, displayName, relevance, null, invocationContext); >@@ -402,7 +406,10 @@ > ch= document.getChar(++p); > } > >- if (ch != ';' && ch != ',' && ch != ')') >+ String closingCharString= getMatchingClosingSymbols(document, offset, lineInfo.getOffset(), lineInfo.getLength()); >+ if (closingCharString.length() != 0 && !ESCAPE_CHAR.equals(closingCharString)) >+ replacementString= replacementString + closingCharString; >+ if (closingCharString.length() == 0 && ch != ';' && ch != ',' && ch != ')' && ch != '}') > replacementString= replacementString + ';'; > > replacementString= Strings.changeIndent(replacementString, 0, project, CodeFormatterUtil.createIndentString(indent, project), lineDelim); >@@ -420,15 +427,8 @@ > while (endPos < lineEndOffset && ch != '(' && ch != ')' && ch != ';' && ch != ',' && !Character.isWhitespace(ch)) > ch= document.getChar(++endPos); > >- int keepLength= endPos - pos; >- if (keepLength > 0) { >- String keepStr= document.get(pos, keepLength); >- replacementString= replacementString + keepStr; >- setCursorPosition(replacementString.length() - keepLength); >- } >- } else >- setCursorPosition(replacementString.length()); >- >+ } >+ setCursorPosition(replacementString.length()); > setReplacementString(replacementString); > > if (pos < document.getLength() && document.getChar(pos) == ')') { >@@ -441,6 +441,140 @@ > return false; > } > >+ private String getMatchingClosingSymbols(IDocument doc, int currentOffset, int lineOffset, int bound) throws BadLocationException { >+ JavaHeuristicScanner scanner= new JavaHeuristicScanner(doc); >+ String lineUnderModification= doc.get(lineOffset, bound); >+ char[] charArray= lineUnderModification.toCharArray(); >+ String returnChar= ""; //$NON-NLS-1$ >+ >+ for (int i= 0; i < charArray.length; i++) { >+ char c= charArray[i]; >+ if (c == '(' || c == '{') { >+ char closingChar= getClosingChar(c); >+ if (c == '(' && lineOffset + i + 1 == currentOffset) >+ continue; >+ int scanForward= scanner.findClosingPeer(lineOffset + i + 1, lineOffset + bound, c, closingChar); >+ if (scanForward == -1) { >+ returnChar= closingChar + returnChar; >+ } >+ } >+ } >+ >+ // decide whether a ';' has to be added to complete the code >+ if (returnChar.length() != 0) >+ return returnChar + ';'; >+ >+ IRegion region= scanner.findSurroundingBlock(lineOffset); >+ int surroundingBlockBound= region.getOffset() + region.getLength(); >+ int posNonWSChar1= scanner.findNonWhitespaceForward(currentOffset, surroundingBlockBound); >+ if (posNonWSChar1 != -1) { >+ String nonWSChar1= doc.get(posNonWSChar1, 1); >+ // make sure we do not set the bound more than the document length >+ if(surroundingBlockBound + 1 < doc.getLength()) >+ surroundingBlockBound++; >+ int posNonWSChar2= scanner.findNonWhitespaceForward(posNonWSChar1 + 1, surroundingBlockBound); >+ >+ if (posNonWSChar2 != -1) { >+ String nonWSChar2= doc.get(posNonWSChar2, 1); >+ >+ // e.g. foo(new Run|, null) or new Run|; or Runnable run= new Runnable(|); or Runnable jobs[] = {new Run|}; >+ if (',' == nonWSChar1.charAt(0) || ';' == nonWSChar1.charAt(0) || (('}' == nonWSChar1.charAt(0) || ')' == nonWSChar1.charAt(0)) && ';' == nonWSChar2.charAt(0))) { >+ // No need to append semicolon as the code already has a ';' or ',' >+ return ESCAPE_CHAR; >+ } >+ >+ // e.g. Runnable jobs[] = {new Runn} >+ // We have to append semicolon, but not as part of the replacement string. >+ if ('}' == nonWSChar1.charAt(0)) { >+ doc.replace(posNonWSChar1 + 1, 0, SEMICOLON); >+ return ESCAPE_CHAR; >+ } >+ } else { >+ // bug 357480#c0 >+ String srcBlock= getSourceFromOffset(doc, currentOffset); >+ if (srcBlock != null) { >+ CompilationUnit compilationUnit= null; >+ try { >+ ASTParser parser= ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL); >+ parser.setSource(srcBlock.toCharArray()); >+ compilationUnit= (CompilationUnit) parser.createAST(null); >+ } catch (ArrayIndexOutOfBoundsException x) { >+ // work around for parser problem >+ } >+ >+ IProblem[] problems= compilationUnit.getProblems(); >+ /* e.g. >+ public class A { | public class A { >+ private Runnable jobs[] = { | { >+ new Run| | new Run| >+ } | } >+ } | } >+ */ >+ // In the above 2 cases do not append semicolon >+ if (problems.length == 1) { >+// doc.replace(posNonWSChar1 + 1, 0, SEMICOLON); >+ return ESCAPE_CHAR; >+ } >+ /* e.g. >+ public class B { >+ private void m1(){ >+ Runnable r= new Run| >+ } >+ } >+ */ >+ if (problems.length == 2) { >+ return returnChar + ';'; >+ } >+ } >+ } >+ >+ /* e.g. >+ private void m1(){ >+ foo(new Runn|) >+ } >+ */ >+ // We have to append semicolon, but not as part of the replacement string. >+ if (')' == nonWSChar1.charAt(0)) { >+ doc.replace(posNonWSChar1 + 1, 0, SEMICOLON); >+ return ESCAPE_CHAR; >+ } >+ } >+ return returnChar; >+ } >+ >+ private char getClosingChar(char c) { >+ switch (c) { >+ case '(': >+ return ')'; >+ >+ case '{': >+ return '}'; >+ >+ default: >+ return '\0'; >+ } >+ } >+ >+ private String getSourceFromOffset(IDocument document, int offset) { >+ try { >+ JavaHeuristicScanner scanner= new JavaHeuristicScanner(document); >+ IRegion sourceRange= scanner.findSurroundingBlock(offset); >+ >+ if (sourceRange == null) >+ return null; >+ >+ String source= document.get(sourceRange.getOffset(), sourceRange.getLength()); >+ StringBuffer contents= new StringBuffer(); >+ contents.append("class ____C{void ____m()"); //$NON-NLS-1$ >+ contents.append(source); >+ contents.append('}'); >+ return contents.toString(); >+ } catch (BadLocationException e) { >+ JavaPlugin.log(e); >+ } >+ return null; >+ } >+ > /* > * @see ICompletionProposalExtension#getContextInformationPosition() > * @since 3.4
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 333428
:
231241
|
244766