View | Details | Raw Unified | Return to bug 333428 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/jdt/text/tests/contentassist/CodeCompletionTest.java (-3 / +451 lines)
Lines 154-172 Link Here
154
		buf.append("package test1;\n");
154
		buf.append("package test1;\n");
155
		buf.append("public class A {\n");
155
		buf.append("public class A {\n");
156
		buf.append("    public void foo() {\n");
156
		buf.append("    public void foo() {\n");
157
		buf.append("        Runnable run= new Runnable(\n");
157
		buf.append("        Runnable run= new Run\n");
158
		buf.append("    }\n");
158
		buf.append("    }\n");
159
		buf.append("    public void bar() {}\n");
159
		buf.append("}\n");
160
		buf.append("}\n");
160
		String contents= buf.toString();
161
		String contents= buf.toString();
161
162
162
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
163
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
163
164
164
		String str= "Runnable run= new Runnable(";
165
		String str= "Runnable run= new Run";
165
166
166
		int offset= contents.indexOf(str) + str.length();
167
		int offset= contents.indexOf(str) + str.length();
167
168
168
		CompletionProposalCollector collector= createCollector(cu, offset);
169
		CompletionProposalCollector collector= createCollector(cu, offset);
169
		collector.setReplacementLength(0);
170
		collector.setReplacementLength(0);
171
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
170
172
171
		codeComplete(cu, offset, collector);
173
		codeComplete(cu, offset, collector);
172
174
Lines 190-195 Link Here
190
				"            }\n" +
192
				"            }\n" +
191
				"        };\n" +
193
				"        };\n" +
192
				"    }\n" +
194
				"    }\n" +
195
				"    public void bar() {}\n" +
193
				"}\n" +
196
				"}\n" +
194
				"");
197
				"");
195
		assertEquals(buf.toString(), doc.get());
198
		assertEquals(buf.toString(), doc.get());
Lines 457-462 Link Here
457
		assertEquals(buf.toString(), doc.get());
460
		assertEquals(buf.toString(), doc.get());
458
	}
461
	}
459
462
463
	public void testAnonymousTypeCompletion7() throws Exception {
464
		// bug 333428#c0 => button.addSelectionListener(new SelectionL
465
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
466
467
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
468
		StringBuffer buf= new StringBuffer();
469
		buf.append("package test1;\n");
470
		buf.append("public class A {\n");
471
		buf.append("    public void foo(Runnable r) {\n");
472
		buf.append("    }\n");
473
		buf.append("    public void bar() {\n");
474
		buf.append("    	foo(new Runn\n");
475
		buf.append("    }\n");
476
		buf.append("}\n");
477
		String contents= buf.toString();
478
479
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
480
481
		String str= "foo(new Runn";
482
483
		int offset= contents.indexOf(str) + str.length();
484
485
		CompletionProposalCollector collector= createCollector(cu, offset);
486
		collector.setReplacementLength(0);
487
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
488
489
		codeComplete(cu, offset, collector);
490
491
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
492
493
		assertNumberOf("proposals", proposals.length, 1);
494
495
		IDocument doc= new Document(contents);
496
497
		proposals[0].apply(doc);
498
499
		buf= new StringBuffer();
500
		buf.append("package test1;\n");
501
		buf.append("public class A {\n");
502
		buf.append("    public void foo(Runnable r) {\n");
503
		buf.append("    }\n");
504
		buf.append("    public void bar() {\n");
505
		buf.append("    	foo(new Runnable() {\n");
506
		buf.append("            \n");
507
		buf.append("            public void run() {\n");
508
		buf.append("                //TODO\n");
509
		buf.append("                \n");
510
		buf.append("            }\n");
511
		buf.append("        });\n");
512
		buf.append("    }\n");
513
		buf.append("}\n");
514
		assertEquals(buf.toString(), doc.get());
515
	}
516
517
	public void testAnonymousTypeCompletion8() throws Exception {
518
		// bug 333428#c0 => button.addSelectionListener(new SelectionL)
519
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
520
521
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
522
		StringBuffer buf= new StringBuffer();
523
		buf.append("package test1;\n");
524
		buf.append("public class A {\n");
525
		buf.append("    public void foo(Runnable r) {\n");
526
		buf.append("    }\n");
527
		buf.append("    public void bar() {\n");
528
		buf.append("    	foo(new Runn)\n");
529
		buf.append("    }\n");
530
		buf.append("}\n");
531
		String contents= buf.toString();
532
533
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
534
535
		String str= "foo(new Runn";
536
537
		int offset= contents.indexOf(str) + str.length();
538
539
		CompletionProposalCollector collector= createCollector(cu, offset);
540
		collector.setReplacementLength(0);
541
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
542
543
		codeComplete(cu, offset, collector);
544
545
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
546
547
		assertNumberOf("proposals", proposals.length, 1);
548
549
		IDocument doc= new Document(contents);
550
551
		proposals[0].apply(doc);
552
553
		buf= new StringBuffer();
554
		buf.append("package test1;\n");
555
		buf.append("public class A {\n");
556
		buf.append("    public void foo(Runnable r) {\n");
557
		buf.append("    }\n");
558
		buf.append("    public void bar() {\n");
559
		buf.append("    	foo(new Runnable() {\n");
560
		buf.append("            \n");
561
		buf.append("            public void run() {\n");
562
		buf.append("                //TODO\n");
563
		buf.append("                \n");
564
		buf.append("            }\n");
565
		buf.append("        });\n");
566
		buf.append("    }\n");
567
		buf.append("}\n");
568
		assertEquals(buf.toString(), doc.get());
569
	}
570
571
572
	public void testAnonymousTypeCompletion9() throws Exception {
573
		// bug 333428#c0 => button.addSelectionListener(new SelectionL);
574
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
575
576
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
577
		StringBuffer buf= new StringBuffer();
578
		buf.append("package test1;\n");
579
		buf.append("public class A {\n");
580
		buf.append("    public void foo(Runnable r) {\n");
581
		buf.append("    }\n");
582
		buf.append("    public void bar() {\n");
583
		buf.append("    	foo(new Runn);\n");
584
		buf.append("    }\n");
585
		buf.append("}\n");
586
		String contents= buf.toString();
587
588
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
589
590
		String str= "foo(new Runn";
591
592
		int offset= contents.indexOf(str) + str.length();
593
594
		CompletionProposalCollector collector= createCollector(cu, offset);
595
		collector.setReplacementLength(0);
596
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
597
598
		codeComplete(cu, offset, collector);
599
600
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
601
602
		assertNumberOf("proposals", proposals.length, 1);
603
604
		IDocument doc= new Document(contents);
605
606
		proposals[0].apply(doc);
607
608
		buf= new StringBuffer();
609
		buf.append("package test1;\n");
610
		buf.append("public class A {\n");
611
		buf.append("    public void foo(Runnable r) {\n");
612
		buf.append("    }\n");
613
		buf.append("    public void bar() {\n");
614
		buf.append("    	foo(new Runnable() {\n");
615
		buf.append("            \n");
616
		buf.append("            public void run() {\n");
617
		buf.append("                //TODO\n");
618
		buf.append("                \n");
619
		buf.append("            }\n");
620
		buf.append("        });\n");
621
		buf.append("    }\n");
622
		buf.append("}\n");
623
		assertEquals(buf.toString(), doc.get());
624
	}
625
626
	public void testAnonymousTypeCompletion10() throws Exception {
627
		/* bug 357480#c0
628
				class A {
629
			    private Runnable jobs[] = {
630
			            new Run|
631
			        };
632
			    }
633
		 */
634
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
635
636
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
637
		StringBuffer buf= new StringBuffer();
638
		buf.append("package test1;\n");
639
		buf.append("public class A {\n");
640
		buf.append("    private Runnable jobs[] = {\n");
641
		buf.append("    new Runn\n");
642
		buf.append("    };\n");
643
		buf.append("}\n");
644
		String contents= buf.toString();
645
646
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
647
648
		String str= "new Runn";
649
650
		int offset= contents.indexOf(str) + str.length();
651
652
		CompletionProposalCollector collector= createCollector(cu, offset);
653
		collector.setReplacementLength(0);
654
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
655
656
		codeComplete(cu, offset, collector);
657
658
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
659
660
		assertNumberOf("proposals", proposals.length, 1);
661
662
		IDocument doc= new Document(contents);
663
664
		proposals[0].apply(doc);
665
666
		buf= new StringBuffer();
667
		buf.append("package test1;\n");
668
		buf.append("public class A {\n");
669
		buf.append("    private Runnable jobs[] = {\n");
670
		buf.append("    new Runnable() {\n");
671
		buf.append("        \n");
672
		buf.append("        public void run() {\n");
673
		buf.append("            //TODO\n");
674
		buf.append("            \n");
675
		buf.append("        }\n");
676
		buf.append("    }\n");
677
		buf.append("    };\n");
678
		buf.append("}\n");
679
		assertEquals(buf.toString(), doc.get());
680
	}
681
682
	public void testAnonymousTypeCompletion11() throws Exception {
683
		/* bug 357480#c0
684
				class A {
685
			    private Runnable jobs[] = {
686
			            new Run|
687
			        }
688
			    }
689
		*/
690
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
691
692
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
693
		StringBuffer buf= new StringBuffer();
694
		buf.append("package test1;\n");
695
		buf.append("public class A {\n");
696
		buf.append("    private Runnable jobs[] = {\n");
697
		buf.append("    new Runn\n");
698
		buf.append("    }\n");
699
		buf.append("}\n");
700
		String contents= buf.toString();
701
702
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
703
704
		String str= "new Runn";
705
706
		int offset= contents.indexOf(str) + str.length();
707
708
		CompletionProposalCollector collector= createCollector(cu, offset);
709
		collector.setReplacementLength(0);
710
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
711
712
		codeComplete(cu, offset, collector);
713
714
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
715
716
		assertNumberOf("proposals", proposals.length, 1);
717
718
		IDocument doc= new Document(contents);
719
720
		proposals[0].apply(doc);
721
722
		buf= new StringBuffer();
723
		buf.append("package test1;\n");
724
		buf.append("public class A {\n");
725
		buf.append("    private Runnable jobs[] = {\n");
726
		buf.append("    new Runnable() {\n");
727
		buf.append("        \n");
728
		buf.append("        public void run() {\n");
729
		buf.append("            //TODO\n");
730
		buf.append("            \n");
731
		buf.append("        }\n");
732
		buf.append("    }\n");
733
		buf.append("    }\n");
734
		buf.append("}\n");
735
		assertEquals(buf.toString(), doc.get());
736
	}
737
738
	public void testAnonymousTypeCompletion12() throws Exception {
739
		/* bug 357480#c0
740
				class A {
741
			    private Runnable jobs[] = {
742
			            new Run|
743
			        }
744
				public void m1(){}
745
			    }
746
		*/
747
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
748
749
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
750
		StringBuffer buf= new StringBuffer();
751
		buf.append("package test1;\n");
752
		buf.append("public class A {\n");
753
		buf.append("    private Runnable jobs[] = {\n");
754
		buf.append("    new Runn\n");
755
		buf.append("    }\n");
756
		buf.append("    public void m1(){}\n");
757
		buf.append("}\n");
758
		String contents= buf.toString();
759
760
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
761
762
		String str= "new Runn";
763
764
		int offset= contents.indexOf(str) + str.length();
765
766
		CompletionProposalCollector collector= createCollector(cu, offset);
767
		collector.setReplacementLength(0);
768
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
769
770
		codeComplete(cu, offset, collector);
771
772
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
773
774
		assertNumberOf("proposals", proposals.length, 1);
775
776
		IDocument doc= new Document(contents);
777
778
		proposals[0].apply(doc);
779
780
		buf= new StringBuffer();
781
		buf.append("package test1;\n");
782
		buf.append("public class A {\n");
783
		buf.append("    private Runnable jobs[] = {\n");
784
		buf.append("    new Runnable() {\n");
785
		buf.append("        \n");
786
		buf.append("        public void run() {\n");
787
		buf.append("            //TODO\n");
788
		buf.append("            \n");
789
		buf.append("        }\n");
790
		buf.append("    }\n");
791
		buf.append("    }\n");
792
		buf.append("    public void m1(){}\n");
793
		buf.append("}\n");
794
		assertEquals(buf.toString(), doc.get());
795
	}
796
797
	public void testAnonymousTypeCompletion13() throws Exception {
798
		/* bug 357480#c0
799
				class A {
800
			    private Runnable jobs[] = {new Run}
801
			    }
802
		 */
803
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
804
805
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
806
		StringBuffer buf= new StringBuffer();
807
		buf.append("package test1;\n");
808
		buf.append("public class A {\n");
809
		buf.append("    private Runnable jobs[] = {new Runn}\n");
810
		buf.append("}\n");
811
		String contents= buf.toString();
812
813
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
814
815
		String str= "new Runn";
816
817
		int offset= contents.indexOf(str) + str.length();
818
819
		CompletionProposalCollector collector= createCollector(cu, offset);
820
		collector.setReplacementLength(0);
821
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
822
823
		codeComplete(cu, offset, collector);
824
825
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
826
827
		assertNumberOf("proposals", proposals.length, 1);
828
829
		IDocument doc= new Document(contents);
830
831
		proposals[0].apply(doc);
832
833
		buf= new StringBuffer();
834
		buf.append("package test1;\n");
835
		buf.append("public class A {\n");
836
		buf.append("    private Runnable jobs[] = {new Runnable() {\n");
837
		buf.append("        \n");
838
		buf.append("        public void run() {\n");
839
		buf.append("            //TODO\n");
840
		buf.append("            \n");
841
		buf.append("        }\n");
842
		buf.append("    }};\n");
843
		buf.append("}\n");
844
		assertEquals(buf.toString(), doc.get());
845
	}
846
847
	public void testAnonymousTypeCompletion14() throws Exception {
848
		/*
849
		  private void m1(Button b){
850
		    foo(new Runn|)
851
			System.out.println();
852
		}
853
		 */
854
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
855
856
		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
857
		StringBuffer buf= new StringBuffer();
858
		buf.append("package test1;\n");
859
		buf.append("public class A {\n");
860
		buf.append("    public void foo(Runnable r) {\n");
861
		buf.append("    }\n");
862
		buf.append("    public void bar() {\n");
863
		buf.append("    	foo(new Runn)\n");
864
		buf.append("    	System.out.println();\n");
865
		buf.append("    }\n");
866
		buf.append("}\n");
867
		String contents= buf.toString();
868
869
		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
870
871
		String str= "foo(new Runn";
872
873
		int offset= contents.indexOf(str) + str.length();
874
875
		CompletionProposalCollector collector= createCollector(cu, offset);
876
		collector.setReplacementLength(0);
877
		collector.setAllowsRequiredProposals(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF, true);
878
879
		codeComplete(cu, offset, collector);
880
881
		IJavaCompletionProposal[] proposals= collector.getJavaCompletionProposals();
882
883
		assertNumberOf("proposals", proposals.length, 1);
884
885
		IDocument doc= new Document(contents);
886
887
		proposals[0].apply(doc);
888
889
		buf= new StringBuffer();
890
		buf.append("package test1;\n");
891
		buf.append("public class A {\n");
892
		buf.append("    public void foo(Runnable r) {\n");
893
		buf.append("    }\n");
894
		buf.append("    public void bar() {\n");
895
		buf.append("    	foo(new Runnable() {\n");
896
		buf.append("            \n");
897
		buf.append("            public void run() {\n");
898
		buf.append("                //TODO\n");
899
		buf.append("                \n");
900
		buf.append("            }\n");
901
		buf.append("        });\n");
902
		buf.append("    	System.out.println();\n");
903
		buf.append("    }\n");
904
		buf.append("}\n");
905
		assertEquals(buf.toString(), doc.get());
906
	}
907
460
	public void testAnonymousTypeCompletionBug280801() throws Exception {
908
	public void testAnonymousTypeCompletionBug280801() throws Exception {
461
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
909
		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
462
910
Lines 595-601 Link Here
595
		buf.append("                //TODO\n");
1043
		buf.append("                //TODO\n");
596
		buf.append("                \n");
1044
		buf.append("                \n");
597
		buf.append("            }\n");
1045
		buf.append("            }\n");
598
		buf.append("        })\n");
1046
		buf.append("        });\n");
599
		buf.append("    }\n");
1047
		buf.append("    }\n");
600
		buf.append("}\n");
1048
		buf.append("}\n");
601
		assertEquals("", buf.toString(), doc.get());
1049
		assertEquals("", buf.toString(), doc.get());
(-)ui/org/eclipse/jdt/internal/ui/text/java/AnonymousTypeCompletionProposal.java (-12 / +146 lines)
Lines 1-5 Link Here
1
/*******************************************************************************
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2011 IBM Corporation and others.
2
 * Copyright (c) 2000, 2013 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
5
 * which accompanies this distribution, and is available at
Lines 43-48 Link Here
43
import org.eclipse.jdt.core.JavaCore;
43
import org.eclipse.jdt.core.JavaCore;
44
import org.eclipse.jdt.core.JavaModelException;
44
import org.eclipse.jdt.core.JavaModelException;
45
import org.eclipse.jdt.core.Signature;
45
import org.eclipse.jdt.core.Signature;
46
import org.eclipse.jdt.core.compiler.IProblem;
46
import org.eclipse.jdt.core.dom.ASTNode;
47
import org.eclipse.jdt.core.dom.ASTNode;
47
import org.eclipse.jdt.core.dom.ASTParser;
48
import org.eclipse.jdt.core.dom.ASTParser;
48
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
49
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
Lines 71-76 Link Here
71
import org.eclipse.jdt.internal.ui.dialogs.OverrideMethodDialog;
72
import org.eclipse.jdt.internal.ui.dialogs.OverrideMethodDialog;
72
import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider;
73
import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider;
73
import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
74
import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
75
import org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner;
74
76
75
77
76
public class AnonymousTypeCompletionProposal extends JavaTypeCompletionProposal implements ICompletionProposalExtension4 {
78
public class AnonymousTypeCompletionProposal extends JavaTypeCompletionProposal implements ICompletionProposalExtension4 {
Lines 82-88 Link Here
82
	private int fContextInformationPosition;
84
	private int fContextInformationPosition;
83
85
84
	private ImportRewrite fImportRewrite;
86
	private ImportRewrite fImportRewrite;
85
87
	
88
	private final String SEMICOLON= ";"; //$NON-NLS-1$
89
	private final String ESCAPE_CHAR= "\r"; //$NON-NLS-1$
86
90
87
	public AnonymousTypeCompletionProposal(IJavaProject jproject, ICompilationUnit cu, JavaContentAssistInvocationContext invocationContext, int start, int length, String constructorCompletion, StyledString displayName, String declarationSignature, IType superType, int relevance) {
91
	public AnonymousTypeCompletionProposal(IJavaProject jproject, ICompilationUnit cu, JavaContentAssistInvocationContext invocationContext, int start, int length, String constructorCompletion, StyledString displayName, String declarationSignature, IType superType, int relevance) {
88
		super(constructorCompletion, cu, start, length, null, displayName, relevance, null, invocationContext);
92
		super(constructorCompletion, cu, start, length, null, displayName, relevance, null, invocationContext);
Lines 402-408 Link Here
402
			ch= document.getChar(++p);
406
			ch= document.getChar(++p);
403
		}
407
		}
404
408
405
		if (ch != ';' && ch != ',' && ch != ')')
409
		String closingCharString= getMatchingClosingSymbols(document, offset, lineInfo.getOffset(), lineInfo.getLength());
410
		if (closingCharString.length() != 0 && !ESCAPE_CHAR.equals(closingCharString))
411
			replacementString= replacementString + closingCharString;
412
		if (closingCharString.length() == 0 && ch != ';' && ch != ',' && ch != ')' && ch != '}')
406
			replacementString= replacementString + ';';
413
			replacementString= replacementString + ';';
407
414
408
		replacementString= Strings.changeIndent(replacementString, 0, project, CodeFormatterUtil.createIndentString(indent, project), lineDelim);
415
		replacementString= Strings.changeIndent(replacementString, 0, project, CodeFormatterUtil.createIndentString(indent, project), lineDelim);
Lines 420-434 Link Here
420
			while (endPos < lineEndOffset && ch != '(' && ch != ')' && ch != ';' && ch != ',' && !Character.isWhitespace(ch))
427
			while (endPos < lineEndOffset && ch != '(' && ch != ')' && ch != ';' && ch != ',' && !Character.isWhitespace(ch))
421
				ch= document.getChar(++endPos);
428
				ch= document.getChar(++endPos);
422
429
423
			int keepLength= endPos - pos;
430
		}
424
			if (keepLength > 0) {
431
		setCursorPosition(replacementString.length());
425
				String keepStr= document.get(pos, keepLength);
426
				replacementString= replacementString + keepStr;
427
				setCursorPosition(replacementString.length() - keepLength);
428
			}
429
		} else
430
			setCursorPosition(replacementString.length());
431
		
432
		setReplacementString(replacementString);
432
		setReplacementString(replacementString);
433
433
434
		if (pos < document.getLength() && document.getChar(pos) == ')') {
434
		if (pos < document.getLength() && document.getChar(pos) == ')') {
Lines 441-446 Link Here
441
		return false;
441
		return false;
442
	}
442
	}
443
443
444
	private String getMatchingClosingSymbols(IDocument doc, int currentOffset, int lineOffset, int bound) throws BadLocationException {
445
		JavaHeuristicScanner scanner= new JavaHeuristicScanner(doc);
446
		String lineUnderModification= doc.get(lineOffset, bound);
447
		char[] charArray= lineUnderModification.toCharArray();
448
		String returnChar= ""; //$NON-NLS-1$
449
450
		for (int i= 0; i < charArray.length; i++) {
451
			char c= charArray[i];
452
			if (c == '(' || c == '{') {
453
				char closingChar= getClosingChar(c);
454
				if (c == '(' && lineOffset + i + 1 == currentOffset)
455
					continue;
456
				int scanForward= scanner.findClosingPeer(lineOffset + i + 1, lineOffset + bound, c, closingChar);
457
				if (scanForward == -1) {
458
					returnChar= closingChar + returnChar;
459
				}
460
			}
461
		}
462
463
		// decide whether a ';' has to be added to complete the code
464
		if (returnChar.length() != 0)
465
			return returnChar + ';';
466
467
		IRegion region= scanner.findSurroundingBlock(lineOffset);
468
		int surroundingBlockBound= region.getOffset() + region.getLength();
469
		int posNonWSChar1= scanner.findNonWhitespaceForward(currentOffset, surroundingBlockBound);
470
		if (posNonWSChar1 != -1) {
471
			String nonWSChar1= doc.get(posNonWSChar1, 1);
472
			// make sure we do not set the bound more than the document length
473
			if(surroundingBlockBound + 1 < doc.getLength())
474
				surroundingBlockBound++;
475
			int posNonWSChar2= scanner.findNonWhitespaceForward(posNonWSChar1 + 1, surroundingBlockBound);
476
477
			if (posNonWSChar2 != -1) {
478
				String nonWSChar2= doc.get(posNonWSChar2, 1);
479
480
				//  e.g. foo(new Run|, null) or new Run|; or Runnable run= new Runnable(|); or Runnable jobs[] = {new Run|};
481
				if (',' == nonWSChar1.charAt(0) || ';' == nonWSChar1.charAt(0) || (('}' == nonWSChar1.charAt(0) || ')' == nonWSChar1.charAt(0)) && ';' == nonWSChar2.charAt(0))) {
482
					// No need to append semicolon as the code already has a ';' or ','
483
					return ESCAPE_CHAR;
484
				}
485
486
				// e.g. Runnable jobs[] = {new Runn}
487
				// We have to append semicolon, but not as part of the replacement string.
488
				if ('}' == nonWSChar1.charAt(0)) {
489
					doc.replace(posNonWSChar1 + 1, 0, SEMICOLON);
490
					return ESCAPE_CHAR;
491
				}
492
			} else {
493
				// bug 357480#c0
494
				String srcBlock= getSourceFromOffset(doc, currentOffset);
495
				if (srcBlock != null) {
496
					CompilationUnit compilationUnit= null;
497
					try {
498
						ASTParser parser= ASTParser.newParser(ASTProvider.SHARED_AST_LEVEL);
499
						parser.setSource(srcBlock.toCharArray());
500
						compilationUnit= (CompilationUnit) parser.createAST(null);
501
					} catch (ArrayIndexOutOfBoundsException x) {
502
						// work around for parser problem
503
					}
504
505
					IProblem[] problems= compilationUnit.getProblems();
506
					/* e.g.
507
					 public class A {					|		public class A {
508
						private Runnable jobs[] = {		|			{
509
							new Run|					|				new Run|
510
						}								|			}
511
					 }									|		}
512
					 */
513
					// In the above 2 cases do not append semicolon
514
					if (problems.length == 1) {
515
//						doc.replace(posNonWSChar1 + 1, 0, SEMICOLON);
516
						return ESCAPE_CHAR;
517
					}
518
					/* e.g.
519
					  	public class B {
520
							private void m1(){
521
								Runnable r= new Run|
522
							}
523
						}
524
					 */
525
					if (problems.length == 2) {
526
						return returnChar + ';';
527
					}
528
				}
529
			}
530
531
			/* e.g.
532
			    private void m1(){
533
			     foo(new Runn|)
534
			    }
535
			 */
536
			// We have to append semicolon, but not as part of the replacement string.
537
			if (')' == nonWSChar1.charAt(0)) {
538
				doc.replace(posNonWSChar1 + 1, 0, SEMICOLON);
539
				return ESCAPE_CHAR;
540
			}
541
		}
542
		return returnChar;
543
	}
544
545
	private char getClosingChar(char c) {
546
		switch (c) {
547
			case '(':
548
				return ')';
549
550
			case '{':
551
				return '}';
552
553
			default:
554
				return '\0';
555
		}
556
	}
557
558
	private String getSourceFromOffset(IDocument document, int offset) {
559
		try {
560
			JavaHeuristicScanner scanner= new JavaHeuristicScanner(document);
561
			IRegion sourceRange= scanner.findSurroundingBlock(offset);
562
			
563
			if (sourceRange == null)
564
				return null;
565
			
566
			String source= document.get(sourceRange.getOffset(), sourceRange.getLength());
567
			StringBuffer contents= new StringBuffer();
568
			contents.append("class ____C{void ____m()"); //$NON-NLS-1$
569
			contents.append(source);
570
			contents.append('}');
571
			return contents.toString();
572
		} catch (BadLocationException e) {
573
			JavaPlugin.log(e);
574
		}
575
		return null;
576
	}
577
444
	/*
578
	/*
445
	 * @see ICompletionProposalExtension#getContextInformationPosition()
579
	 * @see ICompletionProposalExtension#getContextInformationPosition()
446
	 * @since 3.4
580
	 * @since 3.4

Return to bug 333428