Author: akazakov
Date: 2008-02-19 11:00:51 -0500 (Tue, 19 Feb 2008)
New Revision: 6432
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/ElVarSearcher.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/SeamELCompletionEngine.java
Log:
JBIDE-999 Added handling nested vars
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/ElVarSearcher.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/ElVarSearcher.java 2008-02-19
15:16:27 UTC (rev 6431)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/ElVarSearcher.java 2008-02-19
16:00:51 UTC (rev 6432)
@@ -74,13 +74,50 @@
}
/**
+ * Finds var in list of vars that is used in given EL.
+ * @param el EL without brackets.
+ * @param vars
+ * @return
+ */
+ public static Var findVarForEl(String el, List<Var> vars) {
+ if(vars!=null) {
+ ArrayList<Var> parentVars = new ArrayList<Var>();
+ for (Var var : vars) {
+ ELToken token = var.getElToken();
+ if(token!=null && !token.getText().endsWith(".")) {
+ String varName = var.getName();
+ if(el.equals(varName) || el.startsWith(varName + ".")) {
+ if(var.getElToken()!=null) {
+ Var parentVar = findVarForEl(var.getElToken().getText(), parentVars);
+ if(parentVar!=null) {
+ ELToken resolvedToken = parentVar.getResolvedElToken();
+ if(resolvedToken!=null) {
+ String oldText = var.getElToken().getText();
+ String newValue = "#{" + resolvedToken.getText() +
oldText.substring(parentVar.getName().length()) + "}";
+ var.value = newValue;
+ var.elToken = var.parseEl(newValue);
+ }
+ }
+ }
+ return var;
+ }
+ }
+ parentVars.add(var);
+ }
+ }
+ return null;
+ }
+
+ /**
* Represents "var"/"value" attributes.
* @author Alexey Kazakov
*/
public static class Var {
- private String name;
- private String value;
- private ELToken elToken;
+ String name;
+ String value;
+ ELToken elToken;
+ String resolvedValue;
+ ELToken resolvedElToken;
/**
* Constructor
@@ -91,20 +128,42 @@
super();
this.name = name;
this.value = value;
- if(value.length()>3 && value.startsWith("#{") &&
value.endsWith("}")) {
- String elBody = value.substring(0, value.length()-1).substring(2);
+ elToken = parseEl(value);
+ }
+
+ private ELToken parseEl(String el) {
+ if(el.length()>3 && el.startsWith("#{") &&
el.endsWith("}")) {
+ String elBody = el.substring(0, el.length()-1).substring(2);
SeamELTokenizer elTokenizer = new SeamELTokenizer(elBody);
List<ELToken> tokens = elTokenizer.getTokens();
for (ELToken token : tokens) {
if(token.getType()==ELToken.EL_VARIABLE_TOKEN) {
- elToken = token;
- break;
+ return token;
}
}
}
+ return null;
}
/**
+ * Sets value to new resolved EL which we got as result of parsing value.
+ * For example:
+ * <h:datatable value="#{list}" var="item">
+ * <h:dataTable value="#{item.anotherList}"
var="innerItem">
+ * ...
+ * </h:dataTable>
+ * </h:dataTable>
+ * Original El is #{item.anotherList}
+ * Resolved El is #{list.iterator().next().anotherList}
+ * It's very useful for nested vars.
+ * @param newEl
+ */
+ public void resolveValue(String newEl) {
+ resolvedValue = newEl;
+ resolvedElToken = parseEl(newEl);
+ }
+
+ /**
* @return parsed EL from "value" attribute. Returns null if EL is not
valid.
*/
public ELToken getElToken() {
@@ -112,6 +171,13 @@
}
/**
+ * @return parsed resolved EL from "value" attribute. May be null.
+ */
+ public ELToken getResolvedElToken() {
+ return resolvedElToken;
+ }
+
+ /**
* @return name of variable.
*/
public String getName() {
@@ -124,5 +190,12 @@
public String getValue() {
return value;
}
+
+ /**
+ * @return resolved value of variable. It's EL. May be null.
+ */
+ public String getResolvedValue() {
+ return resolvedValue;
+ }
}
}
\ No newline at end of file
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/SeamELCompletionEngine.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/SeamELCompletionEngine.java 2008-02-19
15:16:27 UTC (rev 6431)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/el/SeamELCompletionEngine.java 2008-02-19
16:00:51 UTC (rev 6432)
@@ -211,8 +211,9 @@
public SeamELOperandResolveStatus resolveSeamELOperand(ISeamProject project, IFile file,
String documentContent, CharSequence prefix,
int position, boolean returnEqualedVariablesOnly, List<Var> vars) throws
BadLocationException, StringIndexOutOfBoundsException {
String oldEl = prefix.toString();
- Var var = findVarForEl(oldEl, vars);
+ Var var = ElVarSearcher.findVarForEl(oldEl, vars);
String suffix = "";
+ String newEl = oldEl;
if(var!=null) {
TypeInfoCollector.MemberInfo member = resolveSeamEL(project, file,
var.getElToken().getText());
if(member!=null && !member.getType().isArray()) {
@@ -229,8 +230,10 @@
}
}
}
+ if(var.getElToken()!=null) {
+ newEl = var.getElToken().getText() + suffix +
oldEl.substring(var.getName().length());
+ }
}
- String newEl = replacePrefixByVar(oldEl, var, suffix);
String newDocumentContent = documentContent;
boolean prefixWasChanged = newEl!=oldEl;
if(prefixWasChanged) {
@@ -262,24 +265,13 @@
}
}
+ if(prefixWasChanged) {
+ var.resolveValue("#{" + var.getElToken().getText() + suffix +
"}");
+ }
+
return status;
}
- private Var findVarForEl(String el, List<Var> vars) {
- if(vars!=null) {
- for (Var var : vars) {
- ELToken token = var.getElToken();
- if(token!=null && !token.getText().endsWith(".")) {
- String varName = var.getName();
- if(el.equals(varName) || el.startsWith(varName + ".")) {
- return var;
- }
- }
- }
- }
- return null;
- }
-
/**
* Replace all el variables by variables from found "var" attributes.
* @param el
Show replies by date