protected ICrossReferenceDescription getCrossReferenceDescription() {
   ICrossReferenceDescription _xblockexpression = null;
   {
     ASTNode _node = this.myElement.getNode();
     IElementType _elementType = _node.getElementType();
     EObject _grammarElement = ((IGrammarAwareElementType) _elementType).getGrammarElement();
     final CrossReference crossReference = ((CrossReference) _grammarElement);
     BaseXtextFile _xtextFile = this.myElement.getXtextFile();
     ASTNode _node_1 = this.myElement.getNode();
     final INode node = _xtextFile.getINode(_node_1);
     final EObject context = NodeModelUtils.findActualSemanticObjectFor(node);
     final EReference reference = GrammarUtil.getReference(crossReference);
     List<INode> _findNodesForFeature = NodeModelUtils.findNodesForFeature(context, reference);
     Iterable<Pair<Integer, INode>> _indexed =
         IterableExtensions.<INode>indexed(_findNodesForFeature);
     final Function1<Pair<Integer, INode>, Boolean> _function =
         new Function1<Pair<Integer, INode>, Boolean>() {
           @Override
           public Boolean apply(final Pair<Integer, INode> it) {
             boolean _and = false;
             INode _value = it.getValue();
             int _totalOffset = _value.getTotalOffset();
             int _totalOffset_1 = node.getTotalOffset();
             boolean _lessEqualsThan = (_totalOffset <= _totalOffset_1);
             if (!_lessEqualsThan) {
               _and = false;
             } else {
               INode _value_1 = it.getValue();
               int _totalEndOffset = _value_1.getTotalEndOffset();
               int _totalEndOffset_1 = node.getTotalEndOffset();
               boolean _greaterEqualsThan = (_totalEndOffset >= _totalEndOffset_1);
               _and = _greaterEqualsThan;
             }
             return Boolean.valueOf(_and);
           }
         };
     Pair<Integer, INode> _findFirst =
         IterableExtensions.<Pair<Integer, INode>>findFirst(_indexed, _function);
     Integer _key = null;
     if (_findFirst != null) {
       _key = _findFirst.getKey();
     }
     final Integer index = _key;
     _xblockexpression = this.crossReferenceDescriptionProvider.get(context, reference, index);
   }
   return _xblockexpression;
 }
 @Override
 public Object[] getVariants() {
   ArrayList<LookupElementBuilder> _xblockexpression = null;
   {
     ProgressIndicatorProvider.checkCanceled();
     ICrossReferenceDescription crossReferenceDescription = this.getCrossReferenceDescription();
     boolean _equals = Objects.equal(crossReferenceDescription, null);
     if (_equals) {
       return ((Object[])
           Conversions.unwrapArray(CollectionLiterals.<Object>emptyList(), Object.class));
     }
     ArrayList<LookupElementBuilder> variants =
         CollectionLiterals.<LookupElementBuilder>newArrayList();
     Iterable<IEObjectDescription> _variants = crossReferenceDescription.getVariants();
     for (final IEObjectDescription objectDescription : _variants) {
       {
         ProgressIndicatorProvider.checkCanceled();
         QualifiedName _name = objectDescription.getName();
         String name = this.qualifiedNameConverter.toString(_name);
         BaseXtextFile _xtextFile = this.myElement.getXtextFile();
         XtextResource _resource = _xtextFile.getResource();
         PsiElement element =
             this.psiModelAssociations.getPsiElement(objectDescription, _resource);
         boolean _notEquals = (!Objects.equal(element, null));
         if (_notEquals) {
           LookupElementBuilder _create = LookupElementBuilder.create(name);
           PsiElement _navigationElement = element.getNavigationElement();
           PsiFile _containingFile = _navigationElement.getContainingFile();
           String _name_1 = _containingFile.getName();
           LookupElementBuilder _withTypeText = _create.withTypeText(_name_1);
           variants.add(_withTypeText);
         }
       }
     }
     _xblockexpression = variants;
   }
   return ((Object[]) Conversions.unwrapArray(_xblockexpression, Object.class));
 }