_completionProposalsList.add(completionProposal(_token, _tokenOffset, _offset, validElementName));
_completionProposalsSet.add(new WODCompletionProposal(_token, _tokenOffset, _offset, validElementName));
  protected void fillInElementNameCompletionProposals(IJavaProject _project, IDocument _document, IPath _wodFilePath, String _token, int _tokenOffset, int _offset, List _completionProposalsList) throws CoreException, IOException {    String partialToken = partialToken(_token, _tokenOffset, _offset).toLowerCase();    Iterator validElementNamesIter = validComponentNames(_wodFilePath).iterator();    // We really need something like the AST ... This is a pretty expensive way to go here.    HashSet alreadyUsedElementNames = new HashSet();    try {      WODScanner scanner = WODScanner.newWODScanner();      scanner.setRange(_document, 0, _document.getLength());      IRule matchingRule = null;      while ((matchingRule = scanner.nextMatchingRule()) != null) {        if (matchingRule instanceof ElementNameRule) {          int tokenOffset = scanner.getTokenOffset();          int tokenLength = scanner.getTokenLength();          String alreadyUsedElementName = _document.get(tokenOffset, tokenLength);          alreadyUsedElementNames.add(alreadyUsedElementName);        }      }    }    catch (Throwable t) {      // It's not THAT big of a deal ...      t.printStackTrace();    }    while (validElementNamesIter.hasNext()) {      String validElementName = (String) validElementNamesIter.next();      if (validElementName.toLowerCase().startsWith(partialToken) && !alreadyUsedElementNames.contains(validElementName)) {        _completionProposalsList.add(completionProposal(_token, _tokenOffset, _offset, validElementName));      }    }  }