diff options
author | Reinier Zwitserloot <reinier@zwitserloot.com> | 2010-11-29 16:43:36 +0100 |
---|---|---|
committer | Reinier Zwitserloot <reinier@zwitserloot.com> | 2010-11-29 16:43:36 +0100 |
commit | 7dba9c850c675cc8066fa3e7c79e836bb7ad8203 (patch) | |
tree | 391777ff50fa383b328e4925adbd296f1fcb3c3f /src/eclipseAgent/lombok/eclipse/agent | |
parent | 5e9b99bec80fe488f3fcd173f81adb623b30254c (diff) | |
download | lombok-7dba9c850c675cc8066fa3e7c79e836bb7ad8203.tar.gz lombok-7dba9c850c675cc8066fa3e7c79e836bb7ad8203.tar.bz2 lombok-7dba9c850c675cc8066fa3e7c79e836bb7ad8203.zip |
Added 'val' as a type which the 'val' fake keyword must resolve to before val works,
as a gesture to make val less 'magical'. It even works, in eclipse. Next up: javac.
Diffstat (limited to 'src/eclipseAgent/lombok/eclipse/agent')
-rw-r--r-- | src/eclipseAgent/lombok/eclipse/agent/PatchVal.java | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java b/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java index b93fc4f1..b6523c3c 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java @@ -188,21 +188,47 @@ public class PatchVal { return expr.resolveType(scope); } + public static boolean matches(String key, char[] array) { + if (array == null || key.length() != array.length) return false; + for (int i = 0; i < array.length; i++) { + if (key.charAt(i) != array[i]) return false; + } + + return true; + } + public static boolean handleValForLocalDeclaration(LocalDeclaration local, BlockScope scope) { if (local == null || !LocalDeclaration.class.equals(local.getClass())) return false; boolean decomponent = false; + boolean isVal = false; + if (local.type instanceof SingleTypeReference) { char[] token = ((SingleTypeReference)local.type).token; - if (token == null || token.length != 3) return false; - else if (token[0] != 'v' || token[1] != 'a' || token[2] != 'l') return false; - } else return false; + if (matches("val", token)) isVal = true; + } + + if (local.type instanceof QualifiedTypeReference) { + char[][] tokens = ((QualifiedTypeReference)local.type).tokens; + if (tokens != null && tokens.length == 2 && matches("lombok", tokens[0]) && matches("val", tokens[1])) isVal = true; + } + + if (!isVal) return false; + + TypeBinding resolvedType = local.type.resolvedType; + if (resolvedType == null) resolvedType = local.type.resolveType(scope, false); + if (resolvedType == null) return false; + + char[] pkg = resolvedType.qualifiedPackageName(); + char[] nm = resolvedType.qualifiedSourceName(); + if (!matches("lombok", pkg) || !matches("val", nm)) return false; Expression init = local.initialization; if (init == null && Reflection.initCopyField != null) { try { init = (Expression) Reflection.initCopyField.get(local); } catch (Exception e) { + // init remains null. } } @@ -211,12 +237,11 @@ public class PatchVal { init = (Expression) Reflection.iterableCopyField.get(local); decomponent = true; } catch (Exception e) { + // init remains null. } } TypeReference replacement = null; - if (init != null && decomponent) { - } if (init != null) { TypeBinding resolved = decomponent ? getForEachComponentType(init, scope) : init.resolveType(scope); |