if (descr instanceof PackageDescr) {
PackageDescr packageDescr = (PackageDescr) descr;
// rules
for (RuleDescr ruleDescr : packageDescr.getRules()) {
if (ruleDescr != null) {
BaseDescr result = getDescr(ruleDescr, offset);
if (result != null) {
return result;
}
}
}
// imports
for (ImportDescr importDescr : packageDescr.getImports()) {
if (importDescr != null) {
BaseDescr result = getDescr(importDescr, offset);
if (result != null) {
return result;
}
}
}
// function imports
for (FunctionImportDescr functionImportDescr : packageDescr.getFunctionImports()) {
if (functionImportDescr != null) {
BaseDescr result = getDescr(functionImportDescr, offset);
if (result != null) {
return result;
}
}
}
// functions
for (FunctionDescr functionDescr : packageDescr.getFunctions()) {
if (functionDescr != null) {
BaseDescr result = getDescr(functionDescr, offset);
if (result != null) {
return result;
}
}
}
// attributes
for (AttributeDescr attributeDescr : packageDescr.getAttributes()) {
if (attributeDescr != null) {
BaseDescr result = getDescr(attributeDescr, offset);
if (result != null) {
return result;
}
}
}
// globals
for (GlobalDescr globalDescr : packageDescr.getGlobals()) {
if (globalDescr != null) {
BaseDescr result = getDescr(globalDescr, offset);
if (result != null) {
return result;
}
}
}
return null;
} else {
if (offset < descr.getStartCharacter() || offset > descr.getEndCharacter()) {
return null;
}
if(descr instanceof RuleDescr) {
RuleDescr ruleDescr = (RuleDescr) descr;
// rules attributes
for (AttributeDescr attributeDescr : ruleDescr.getAttributes().values()) {
if (attributeDescr != null) {
BaseDescr result = getDescr(attributeDescr, offset);
if (result != null) {
return result;
}
}
}