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 |
|