/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.el.core.model;
import java.util.List;
import org.jboss.tools.common.el.core.parser.LexicalToken;
public class ELUtil {
public static ELInstance findInstance(ELModel model, int offset) {
if(model == null) return null;
List<ELInstance> is = model.getInstances();
for (ELInstance i: is) {
if(i.getStartPosition() >= offset) continue;
LexicalToken c = i.getCloseInstanceToken();
if(c != null) {
if(c.getStart() >= offset) return i;
} else {
if(i.getEndPosition() >= offset) return i;
}
}
return null;
}
public static ELInvocationExpression findExpression(ELModel model, int offset) {
ELInvocationExpression result = null;
int off = -1;
List<ELInstance> is = model.getInstances();
for (ELInstance i: is) {
ELExpression expr = i.getExpression();
if(expr == null) continue;
if(expr.getFirstToken().getStart() > offset) continue;
List<ELInvocationExpression> invs = expr.getInvocations();
for (ELInvocationExpression inv: invs) {
if(inv.getStartPosition() <= offset && inv.getEndPosition() >= offset) {
if(off < inv.getStartPosition()) {
ELInvocationExpression res = inv;
off = inv.getStartPosition();
ELInvocationExpression l = inv.getLeft();
while(l != null && l.getEndPosition() >= offset) {
res = l;
l = l.getLeft();
}
if(result == null || result.toString().length() > res.toString().length()) {
result = res;
}
}
}
}
if(result != null) {
if(result instanceof ELMethodInvocation && ((ELMethodInvocation)result).getParameters() != null) {
ELParameters p = ((ELMethodInvocation)result).getParameters();
if(p.getStartPosition() < offset && p.getEndPosition() > offset) {
result = null;
}
}
return result;
}
}
return result;
}
}