public static Collection<CompletionItem> create(
     MethodDefinition def, int startOffset, int caretOffset, CompletionContext context) {
   if (def.isAnonymous()) return Collections.emptyList();
   int priorityDecrementor = 0;
   boolean optionalAt = false;
   StringBuilder visibleText = new StringBuilder();
   if (def.getFileObject().equals(context.getFile())) {
     priorityDecrementor++;
     if (def.isClassMember() && def.visible(caretOffset)) {
       optionalAt = true;
     }
   }
   visibleText.append(def.getText()).append(def.getParamString());
   switch (context.getType()) {
     case DEFAULT:
       if (optionalAt) visibleText.insert(0, thisPrefix);
       return Collections.<CompletionItem>singletonList(
           new MethodCompletionItem(
               visibleText.toString(),
               def.getText(),
               def.getFileObject().getNameExt(),
               startOffset,
               caretOffset,
               priorityDecrementor));
     case CLASS_ONLY_ACCESSOR:
       if (def.isClassMember() && def.getClassName().equals(context.getClassName()))
         return Collections.<CompletionItem>singletonList(
             new MethodCompletionItem(
                 visibleText.toString(),
                 def.getText(),
                 def.getFileObject().getNameExt(),
                 startOffset,
                 caretOffset,
                 priorityDecrementor));
       break;
     case NORMAL_ACCESSOR:
       return Collections.<CompletionItem>singletonList(
           new MethodCompletionItem(
               visibleText.toString(),
               def.getText(),
               def.getFileObject().getNameExt(),
               startOffset,
               caretOffset,
               priorityDecrementor));
   }
   return Collections.emptyList();
 }