View | Details | Raw Unified | Return to bug 209479
Collapse All | Expand All

(-)model/org/eclipse/jdt/internal/core/util/BindingKeyParser.java (-55 / +64 lines)
Lines 1-5 Link Here
1
/*******************************************************************************
1
/*******************************************************************************
2
 * Copyright (c) 2005, 2009 IBM Corporation and others.
2
 * Copyright (c) 2005, 2010 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 444-449 Link Here
444
444
445
	private boolean hasTypeName = true;
445
	private boolean hasTypeName = true;
446
446
447
	private boolean isMalformed;
448
447
	public BindingKeyParser(BindingKeyParser parser) {
449
	public BindingKeyParser(BindingKeyParser parser) {
448
		this(""); //$NON-NLS-1$
450
		this(""); //$NON-NLS-1$
449
		this.scanner = parser.scanner;
451
		this.scanner = parser.scanner;
Lines 577-583 Link Here
577
	}
579
	}
578
580
579
	public void malformedKey() {
581
	public void malformedKey() {
580
		// default is to do nothing
582
		this.isMalformed = true;
581
	}
583
	}
582
584
583
	public BindingKeyParser newParser() {
585
	public BindingKeyParser newParser() {
Lines 684-721 Link Here
684
				consumeBaseType(this.scanner.getTokenSource());
686
				consumeBaseType(this.scanner.getTokenSource());
685
				this.hasTypeName = false;
687
				this.hasTypeName = false;
686
				break;
688
				break;
687
	 		case Scanner.ARRAY:
689
			case Scanner.ARRAY:
688
	 			this.keyStart = this.scanner.start;
690
				this.keyStart = this.scanner.start;
689
	 			consumeArrayDimension(this.scanner.getTokenSource());
691
				consumeArrayDimension(this.scanner.getTokenSource());
690
	 			switch (this.scanner.nextToken()) {
692
				switch (this.scanner.nextToken()) {
691
	 				case Scanner.TYPE:
693
					case Scanner.TYPE:
692
		 				consumeFullyQualifiedName(this.scanner.getTokenSource());
694
						consumeFullyQualifiedName(this.scanner.getTokenSource());
693
		 				break;
695
						break;
694
	 				case Scanner.BASE_TYPE:
696
					case Scanner.BASE_TYPE:
695
	 					consumeBaseType(this.scanner.getTokenSource());
697
						consumeBaseType(this.scanner.getTokenSource());
696
	 					this.hasTypeName = false;
698
						this.hasTypeName = false;
697
	 					break;
699
						break;
698
	 				default:
700
					default:
699
						malformedKey();
701
						malformedKey();
700
						return;
702
						return;
701
				}
703
				}
702
				break;
704
				break;
703
			default:
705
			default:
704
	 			malformedKey();
706
				malformedKey();
705
				return;
707
				return;
706
		}
708
		}
707
	}
709
	}
708
710
709
	private void parseParameterizedMethod() {
711
	private void parseParameterizedMethod() {
710
		this.scanner.skipParametersStart();
712
		this.scanner.skipParametersStart();
711
		while (!this.scanner.isAtParametersEnd()) {
713
		while (!this.scanner.isAtParametersEnd() && !this.isMalformed) {
712
			parseTypeArgument();
714
			parseTypeArgument();
713
		}
715
		}
714
		consumeParameterizedGenericMethod();
716
		consumeParameterizedGenericMethod();
715
	}
717
	}
716
718
717
	private void parseGenericType() {
719
	private void parseGenericType() {
718
		while (!this.scanner.isAtParametersEnd()) {
720
		while (!this.scanner.isAtParametersEnd() && !this.isMalformed) {
719
			if (this.scanner.nextToken() != Scanner.TYPE) {
721
			if (this.scanner.nextToken() != Scanner.TYPE) {
720
				malformedKey();
722
				malformedKey();
721
				return;
723
				return;
Lines 729-745 Link Here
729
		if (!this.scanner.isAtMemberTypeStart() || this.scanner.nextToken() != Scanner.TYPE)
731
		if (!this.scanner.isAtMemberTypeStart() || this.scanner.nextToken() != Scanner.TYPE)
730
			return;
732
			return;
731
		char[] typeName = this.scanner.getTokenSource();
733
		char[] typeName = this.scanner.getTokenSource();
732
	 	if (Character.isDigit(typeName[0])) {
734
		if (Character.isDigit(typeName[0])) {
733
	 		// anonymous or local type
735
			// anonymous or local type
734
	 		int nextToken = Scanner.TYPE;
736
			int nextToken = Scanner.TYPE;
735
	 		while (this.scanner.isAtMemberTypeStart())
737
			while (this.scanner.isAtMemberTypeStart() && !this.isMalformed)
736
	 			nextToken = this.scanner.nextToken();
738
				nextToken = this.scanner.nextToken();
737
	 		typeName = nextToken == Scanner.END ? this.scanner.source : CharOperation.subarray(this.scanner.source, this.keyStart, this.scanner.index+1);
739
			typeName = nextToken == Scanner.END ? this.scanner.source : CharOperation.subarray(this.scanner.source, this.keyStart, this.scanner.index+1);
738
	 		consumeLocalType(typeName);
740
			consumeLocalType(typeName);
739
	 	} else {
741
		} else {
740
			consumeMemberType(typeName);
742
			consumeMemberType(typeName);
741
			parseInnerType();
743
			parseInnerType();
742
	 	}
744
		}
743
	}
745
	}
744
746
745
	private void parseLocalVariable() {
747
	private void parseLocalVariable() {
Lines 792-807 Link Here
792
		parser.parse();
794
		parser.parse();
793
		consumeParser(parser);
795
		consumeParser(parser);
794
		consumeAnnotation();
796
		consumeAnnotation();
797
		this.isMalformed = parser.isMalformed;
795
		this.scanner.token = token;
798
		this.scanner.token = token;
796
	}
799
	}
797
800
798
	private void parseCapture() {
801
	private void parseCapture() {
799
		if (this.scanner.nextToken() != Scanner.CAPTURE) return;
802
		if (this.scanner.nextToken() != Scanner.CAPTURE) return;
800
	 	parseCaptureWildcard();
803
		parseCaptureWildcard();
801
		if (this.scanner.nextToken() != Scanner.TYPE) {
804
		if (this.scanner.nextToken() != Scanner.TYPE) {
802
	 		malformedKey();
805
			malformedKey();
803
			return;
806
			return;
804
	 	}
807
		}
805
		char[] positionChars = this.scanner.getTokenSource();
808
		char[] positionChars = this.scanner.getTokenSource();
806
		int position = Integer.parseInt(new String(positionChars));
809
		int position = Integer.parseInt(new String(positionChars));
807
		consumeCapture(position);
810
		consumeCapture(position);
Lines 817-822 Link Here
817
		BindingKeyParser parser = newParser();
820
		BindingKeyParser parser = newParser();
818
		parser.parse();
821
		parser.parse();
819
		consumeParser(parser);
822
		consumeParser(parser);
823
		this.isMalformed = parser.isMalformed;
820
		this.scanner.token = token;
824
		this.scanner.token = token;
821
	}
825
	}
822
826
Lines 832-850 Link Here
832
		 * See bug 264443
836
		 * See bug 264443
833
		 */
837
		 */
834
		int token = this.scanner.token;
838
		int token = this.scanner.token;
835
		while (this.scanner.isAtThrownStart()) {
839
		while (this.scanner.isAtThrownStart() && !this.isMalformed) {
836
			this.scanner.skipThrownStart();
840
			this.scanner.skipThrownStart();
837
			BindingKeyParser parser = newParser();
841
			BindingKeyParser parser = newParser();
838
			parser.parse();
842
			parser.parse();
839
			consumeParser(parser);
843
			consumeParser(parser);
840
			consumeException();
844
			consumeException();
845
			this.isMalformed = parser.isMalformed;
841
		}
846
		}
842
		this.scanner.token = token;
847
		this.scanner.token = token;
843
	}
848
	}
844
849
845
	private void parseParameterizedType(char[] typeName, boolean isRaw) {
850
	private void parseParameterizedType(char[] typeName, boolean isRaw) {
846
		if (!isRaw) {
851
		if (!isRaw) {
847
			while (!this.scanner.isAtParametersEnd()) {
852
			while (!this.scanner.isAtParametersEnd() && !this.isMalformed) {
848
				parseTypeArgument();
853
				parseTypeArgument();
849
			}
854
			}
850
		}
855
		}
Lines 886-891 Link Here
886
		BindingKeyParser parser = newParser();
891
		BindingKeyParser parser = newParser();
887
		parser.parse();
892
		parser.parse();
888
		consumeParser(parser);
893
		consumeParser(parser);
894
		this.isMalformed = parser.isMalformed;
889
		this.scanner.token = token;
895
		this.scanner.token = token;
890
	}
896
	}
891
897
Lines 903-908 Link Here
903
		BindingKeyParser parser = newParser();
909
		BindingKeyParser parser = newParser();
904
		parser.parse();
910
		parser.parse();
905
		consumeParser(parser);
911
		consumeParser(parser);
912
		this.isMalformed = parser.isMalformed;
906
		this.scanner.token = token;
913
		this.scanner.token = token;
907
	}
914
	}
908
915
Lines 917-922 Link Here
917
		parser.parse();
924
		parser.parse();
918
		consumeParser(parser);
925
		consumeParser(parser);
919
		consumeTypeWithCapture();
926
		consumeTypeWithCapture();
927
		this.isMalformed = parser.isMalformed;
920
		this.scanner.token = token;
928
		this.scanner.token = token;
921
	}
929
	}
922
930
Lines 942-971 Link Here
942
	private void parseWildcard() {
950
	private void parseWildcard() {
943
		parseWildcardRank();
951
		parseWildcardRank();
944
		if (this.scanner.nextToken() != Scanner.WILDCARD) return;
952
		if (this.scanner.nextToken() != Scanner.WILDCARD) return;
945
	 	char[] source = this.scanner.getTokenSource();
953
		char[] source = this.scanner.getTokenSource();
946
	 	if (source.length == 0) {
954
		if (source.length == 0) {
947
	 		malformedKey();
955
			malformedKey();
948
	 		return;
956
			return;
949
	 	}
957
		}
950
	 	int kind = -1;
958
		int kind = -1;
951
	 	switch (source[0]) {
959
		switch (source[0]) {
952
		 	case '*':
960
			case '*':
953
		 		kind = Wildcard.UNBOUND;
961
				kind = Wildcard.UNBOUND;
954
		 		break;
962
				break;
955
		 	case '+':
963
			case '+':
956
		 		kind = Wildcard.EXTENDS;
964
				kind = Wildcard.EXTENDS;
957
		 		break;
965
				break;
958
		 	case '-':
966
			case '-':
959
		 		kind = Wildcard.SUPER;
967
				kind = Wildcard.SUPER;
960
		 		break;
968
				break;
961
	 	}
969
		}
962
	 	if (kind == -1) {
970
		if (kind == -1) {
963
	 		malformedKey();
971
			malformedKey();
964
	 		return;
972
			return;
965
	 	}
973
		}
966
	 	if (kind != Wildcard.UNBOUND)
974
		if (kind != Wildcard.UNBOUND)
967
	 		parseWildcardBound();
975
			parseWildcardBound();
968
	 	consumeWildCard(kind);
976
		consumeWildCard(kind);
969
	}
977
	}
970
978
971
	private void parseWildcardRank() {
979
	private void parseWildcardRank() {
Lines 985-990 Link Here
985
		BindingKeyParser parser = newParser();
993
		BindingKeyParser parser = newParser();
986
		parser.parse();
994
		parser.parse();
987
		consumeParser(parser);
995
		consumeParser(parser);
996
		this.isMalformed = parser.isMalformed;
988
		this.scanner.token = token;
997
		this.scanner.token = token;
989
	}
998
	}
990
999
(-)src/org/eclipse/jdt/core/tests/model/BindingKeyTests.java (-1 / +8 lines)
Lines 1-5 Link Here
1
/*******************************************************************************
1
/*******************************************************************************
2
 * Copyright (c) 2005, 2009 IBM Corporation and others.
2
 * Copyright (c) 2005, 2010 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 621-624 Link Here
621
			"LX;&LX~Box<!LX~Box;{0}*232;!LX~Box;{1}*232;>;.value)!LX~Box;{0}*232;"
621
			"LX;&LX~Box<!LX~Box;{0}*232;!LX~Box;{1}*232;>;.value)!LX~Box;{0}*232;"
622
		);
622
		);
623
	}
623
	}
624
625
	/*
626
	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=209479
627
	 */
628
	public void test055() {
629
		assertFalse("Should not be a raw type", new BindingKey("Ltest/ZZ<Ljava/lang/Object>;").isRawType());
630
	}
624
}
631
}

Return to bug 209479