]>
Commit | Line | Data |
---|---|---|
1b2798f6 EK |
1 | /******************************************************************************* |
2 | * Copyright (c) 2000, 2011 IBM Corporation and others. | |
3 | * All rights reserved. This program and the accompanying materials | |
4 | * are made available under the terms of the Eclipse Public License v1.0 | |
5 | * which accompanies this distribution, and is available at | |
6 | * http://www.eclipse.org/legal/epl-v10.html | |
7 | * | |
8 | * Contributors: | |
9 | * IBM Corporation - initial API and implementation | |
10 | *******************************************************************************/ | |
11 | package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types; | |
12 | ||
13 | import org.eclipse.core.runtime.Assert; | |
14 | ||
15 | import org.eclipse.jdt.core.IJavaProject; | |
16 | import org.eclipse.jdt.core.dom.ITypeBinding; | |
17 | ||
18 | ||
19 | ||
20 | public final class CaptureType extends AbstractTypeVariable { | |
21 | ||
22 | private WildcardType fWildcard; | |
23 | IJavaProject fJavaProject; | |
24 | ||
25 | protected CaptureType(TypeEnvironment environment) { | |
26 | super(environment); | |
27 | } | |
28 | ||
29 | protected void initialize(ITypeBinding binding, IJavaProject javaProject) { | |
30 | Assert.isTrue(binding.isCapture()); | |
31 | super.initialize(binding); | |
32 | fWildcard= (WildcardType) getEnvironment().create(binding.getWildcard()); | |
33 | fJavaProject= javaProject; | |
34 | } | |
35 | ||
36 | @Override | |
37 | public int getKind() { | |
38 | return CAPTURE_TYPE; | |
39 | } | |
40 | ||
41 | public WildcardType getWildcard() { | |
42 | return fWildcard; | |
43 | } | |
44 | ||
45 | @Override | |
46 | public boolean doEquals(TType type) { | |
47 | return type.generated_4797472232774948677(this); | |
48 | } | |
49 | ||
50 | @Override | |
51 | public int hashCode() { | |
52 | return getBindingKey().hashCode(); | |
53 | } | |
54 | ||
55 | @Override | |
56 | protected boolean doCanAssignTo(TType lhs) { | |
57 | switch (lhs.getKind()) { | |
58 | case NULL_TYPE: | |
59 | case VOID_TYPE: | |
60 | case PRIMITIVE_TYPE: | |
61 | return false; | |
62 | ||
63 | case ARRAY_TYPE: | |
64 | return canAssignFirstBoundTo(lhs); | |
65 | ||
66 | case GENERIC_TYPE: | |
67 | return false; | |
68 | ||
69 | case STANDARD_TYPE: | |
70 | case PARAMETERIZED_TYPE: | |
71 | case RAW_TYPE: | |
72 | return canAssignOneBoundTo(lhs); | |
73 | ||
74 | case UNBOUND_WILDCARD_TYPE: | |
75 | case EXTENDS_WILDCARD_TYPE: | |
76 | case SUPER_WILDCARD_TYPE: | |
77 | return ((WildcardType)lhs).checkAssignmentBound(this); | |
78 | ||
79 | case TYPE_VARIABLE: | |
80 | return false; //fWildcard.doCanAssignTo(lhs); | |
81 | ||
82 | case CAPTURE_TYPE: | |
83 | return ((CaptureType)lhs).checkLowerBound(this.getWildcard()); | |
84 | ||
85 | } | |
86 | return false; | |
87 | } | |
88 | ||
89 | protected boolean checkLowerBound(TType rhs) { | |
90 | if (! getWildcard().isSuperWildcardType()) | |
91 | return false; | |
92 | ||
93 | return rhs.canAssignTo(getWildcard().getBound()); | |
94 | } | |
95 | ||
96 | private boolean canAssignFirstBoundTo(TType lhs) { | |
97 | if (fBounds.length > 0 && fBounds[0].isArrayType()) { | |
98 | // capture of ? extends X[] | |
99 | return fBounds[0].canAssignTo(lhs); | |
100 | } | |
101 | return false; | |
102 | } | |
103 | ||
104 | @Override | |
105 | public String getName() { | |
106 | return ""; //$NON-NLS-1$ | |
107 | } | |
108 | ||
109 | @Override | |
110 | protected String getPlainPrettySignature() { | |
111 | return "capture-of " + fWildcard.getPrettySignature(); //$NON-NLS-1$ | |
112 | } | |
113 | } |