Program: 87917
Project: 87917
Buggy source:
public SuggestedWords getSuggestedWords(final WordComposer wordComposer,CharSequence prevWordForBigram,final ProximityInfo proximityInfo,final boolean isCorrectionEnabled,final boolean isPrediction){
  LatinImeLogger.onStartSuggestion(prevWordForBigram);
  final boolean isFirstCharCapitalized=!isPrediction && wordComposer.isFirstCharCapitalized();
  final boolean isAllUpperCase=!isPrediction && wordComposer.isAllUpperCase();
  final int trailingSingleQuotesCount=wordComposer.trailingSingleQuotesCount();
  final BoundedTreeSet suggestionsSet=new BoundedTreeSet(sSuggestedWordInfoComparator,MAX_SUGGESTIONS);
  final String typedWord=wordComposer.getTypedWord();
  final String consideredWord=trailingSingleQuotesCount > 0 ? typedWord.substring(0,typedWord.length() - trailingSingleQuotesCount) : typedWord;
  LatinImeLogger.onAddSuggestedWord(typedWord,Dictionary.TYPE_USER_TYPED);
  if (wordComposer.size() <= 1 && isCorrectionEnabled) {
    if (!TextUtils.isEmpty(prevWordForBigram)) {
      final CharSequence lowerPrevWord;
      if (StringUtils.hasUpperCase(prevWordForBigram)) {
        lowerPrevWord=prevWordForBigram.toString().toLowerCase();
      }
 else {
        lowerPrevWord=null;
      }
      for (      final String key : mDictionaries.keySet()) {
        final Dictionary dictionary=mDictionaries.get(key);
        suggestionsSet.addAll(dictionary.getBigrams(wordComposer,prevWordForBigram));
        if (null != lowerPrevWord) {
          suggestionsSet.addAll(dictionary.getBigrams(wordComposer,lowerPrevWord));
        }
      }
    }
  }
 else   if (wordComposer.size() > 1) {
    final WordComposer wordComposerForLookup;
    if (trailingSingleQuotesCount > 0) {
      wordComposerForLookup=new WordComposer(wordComposer);
      for (int i=trailingSingleQuotesCount - 1; i >= 0; --i) {
        wordComposerForLookup.deleteLast();
      }
    }
 else {
      wordComposerForLookup=wordComposer;
    }
    for (    final String key : mDictionaries.keySet()) {
      if (key.equals(Dictionary.TYPE_USER_HISTORY) || key.equals(Dictionary.TYPE_WHITELIST))       continue;
      final Dictionary dictionary=mDictionaries.get(key);
      suggestionsSet.addAll(dictionary.getWords(wordComposerForLookup,prevWordForBigram,proximityInfo));
    }
  }
  final boolean allowsToBeAutoCorrected=AutoCorrection.isWhitelistedOrNotAWord(mDictionaries,consideredWord,wordComposer.isFirstCharCapitalized()) && hasMainDictionary();
  final CharSequence whitelistedWord=mWhiteListDictionary.getWhitelistedWord(consideredWord);
  final boolean hasAutoCorrection;
  if (!isCorrectionEnabled || wordComposer.isMostlyCaps() || wordComposer.isResumed()) {
    hasAutoCorrection=false;
  }
 else   if (null != whitelistedWord) {
    hasAutoCorrection=true;
  }
 else   if (!AutoCorrection.isWhitelistedOrNotAWord(mDictionaries,consideredWord,wordComposer.isFirstCharCapitalized())) {
    hasAutoCorrection=true;
  }
 else   if (suggestionsSet.isEmpty()) {
    hasAutoCorrection=false;
  }
 else   if (AutoCorrection.suggestionExceedsAutoCorrectionThreshold(suggestionsSet.first(),consideredWord,mAutoCorrectionThreshold)) {
    hasAutoCorrection=!shouldBlockAutoCorrectionBySafetyNet(typedWord,suggestionsSet.first().mWord);
  }
 else {
    hasAutoCorrection=false;
  }
  if (whitelistedWord != null) {
    suggestionsSet.add(new SuggestedWordInfo(whitelistedWord,SuggestedWordInfo.MAX_SCORE,SuggestedWordInfo.KIND_WHITELIST,Dictionary.TYPE_WHITELIST));
  }
  final ArrayList<SuggestedWordInfo> suggestionsContainer=new ArrayList<SuggestedWordInfo>(suggestionsSet);
  final int suggestionsCount=suggestionsContainer.size();
  if (isFirstCharCapitalized || isAllUpperCase || 0 != trailingSingleQuotesCount) {
    for (int i=0; i < suggestionsCount; ++i) {
      final SuggestedWordInfo wordInfo=suggestionsContainer.get(i);
      final SuggestedWordInfo transformedWordInfo=getTransformedSuggestedWordInfo(wordInfo,mLocale,isAllUpperCase,isFirstCharCapitalized,trailingSingleQuotesCount);
      suggestionsContainer.set(i,transformedWordInfo);
    }
  }
  for (int i=0; i < suggestionsCount; ++i) {
    final SuggestedWordInfo wordInfo=suggestionsContainer.get(i);
    LatinImeLogger.onAddSuggestedWord(wordInfo.mWord.toString(),wordInfo.mSourceDict);
  }
  if (!TextUtils.isEmpty(typedWord)) {
    suggestionsContainer.add(0,new SuggestedWordInfo(typedWord,SuggestedWordInfo.MAX_SCORE,SuggestedWordInfo.KIND_TYPED,Dictionary.TYPE_USER_TYPED));
  }
  SuggestedWordInfo.removeDups(suggestionsContainer);
  final ArrayList<SuggestedWordInfo> suggestionsList;
  if (DBG && !suggestionsContainer.isEmpty()) {
    suggestionsList=getSuggestionsInfoListWithDebugInfo(typedWord,suggestionsContainer);
  }
 else {
    suggestionsList=suggestionsContainer;
  }
  return new SuggestedWords(suggestionsList,!isPrediction && !allowsToBeAutoCorrected,!isPrediction && hasAutoCorrection && allowsToBeAutoCorrected,false,false,isPrediction);
}

Fixed version (ground truth):
public SuggestedWords getSuggestedWords(final WordComposer wordComposer,CharSequence prevWordForBigram,final ProximityInfo proximityInfo,final boolean isCorrectionEnabled,final boolean isPrediction){
  LatinImeLogger.onStartSuggestion(prevWordForBigram);
  final boolean isFirstCharCapitalized=!isPrediction && wordComposer.isFirstCharCapitalized();
  final boolean isAllUpperCase=!isPrediction && wordComposer.isAllUpperCase();
  final int trailingSingleQuotesCount=wordComposer.trailingSingleQuotesCount();
  final BoundedTreeSet suggestionsSet=new BoundedTreeSet(sSuggestedWordInfoComparator,MAX_SUGGESTIONS);
  final String typedWord=wordComposer.getTypedWord();
  final String consideredWord=trailingSingleQuotesCount > 0 ? typedWord.substring(0,typedWord.length() - trailingSingleQuotesCount) : typedWord;
  LatinImeLogger.onAddSuggestedWord(typedWord,Dictionary.TYPE_USER_TYPED);
  if (wordComposer.size() <= 1 && isCorrectionEnabled) {
    if (!TextUtils.isEmpty(prevWordForBigram)) {
      final CharSequence lowerPrevWord;
      if (StringUtils.hasUpperCase(prevWordForBigram)) {
        lowerPrevWord=prevWordForBigram.toString().toLowerCase();
      }
 else {
        lowerPrevWord=null;
      }
      for (      final String key : mDictionaries.keySet()) {
        final Dictionary dictionary=mDictionaries.get(key);
        suggestionsSet.addAll(dictionary.getBigrams(wordComposer,prevWordForBigram));
        if (null != lowerPrevWord) {
          suggestionsSet.addAll(dictionary.getBigrams(wordComposer,lowerPrevWord));
        }
      }
    }
  }
 else   if (wordComposer.size() > 1) {
    final WordComposer wordComposerForLookup;
    if (trailingSingleQuotesCount > 0) {
      wordComposerForLookup=new WordComposer(wordComposer);
      for (int i=trailingSingleQuotesCount - 1; i >= 0; --i) {
        wordComposerForLookup.deleteLast();
      }
    }
 else {
      wordComposerForLookup=wordComposer;
    }
    for (    final String key : mDictionaries.keySet()) {
      if (key.equals(Dictionary.TYPE_USER_HISTORY) || key.equals(Dictionary.TYPE_WHITELIST))       continue;
      final Dictionary dictionary=mDictionaries.get(key);
      suggestionsSet.addAll(dictionary.getWords(wordComposerForLookup,prevWordForBigram,proximityInfo));
    }
  }
  final boolean allowsToBeAutoCorrected=AutoCorrection.isWhitelistedOrNotAWord(mDictionaries,consideredWord,wordComposer.isFirstCharCapitalized());
  final CharSequence whitelistedWord=mWhiteListDictionary.getWhitelistedWord(consideredWord);
  final boolean hasAutoCorrection;
  if (!isCorrectionEnabled || wordComposer.isMostlyCaps() || wordComposer.isResumed()|| !hasMainDictionary()) {
    hasAutoCorrection=false;
  }
 else   if (null != whitelistedWord) {
    hasAutoCorrection=true;
  }
 else   if (!allowsToBeAutoCorrected) {
    hasAutoCorrection=true;
  }
 else   if (suggestionsSet.isEmpty()) {
    hasAutoCorrection=false;
  }
 else   if (AutoCorrection.suggestionExceedsAutoCorrectionThreshold(suggestionsSet.first(),consideredWord,mAutoCorrectionThreshold)) {
    hasAutoCorrection=!shouldBlockAutoCorrectionBySafetyNet(typedWord,suggestionsSet.first().mWord);
  }
 else {
    hasAutoCorrection=false;
  }
  if (whitelistedWord != null) {
    suggestionsSet.add(new SuggestedWordInfo(whitelistedWord,SuggestedWordInfo.MAX_SCORE,SuggestedWordInfo.KIND_WHITELIST,Dictionary.TYPE_WHITELIST));
  }
  final ArrayList<SuggestedWordInfo> suggestionsContainer=new ArrayList<SuggestedWordInfo>(suggestionsSet);
  final int suggestionsCount=suggestionsContainer.size();
  if (isFirstCharCapitalized || isAllUpperCase || 0 != trailingSingleQuotesCount) {
    for (int i=0; i < suggestionsCount; ++i) {
      final SuggestedWordInfo wordInfo=suggestionsContainer.get(i);
      final SuggestedWordInfo transformedWordInfo=getTransformedSuggestedWordInfo(wordInfo,mLocale,isAllUpperCase,isFirstCharCapitalized,trailingSingleQuotesCount);
      suggestionsContainer.set(i,transformedWordInfo);
    }
  }
  for (int i=0; i < suggestionsCount; ++i) {
    final SuggestedWordInfo wordInfo=suggestionsContainer.get(i);
    LatinImeLogger.onAddSuggestedWord(wordInfo.mWord.toString(),wordInfo.mSourceDict);
  }
  if (!TextUtils.isEmpty(typedWord)) {
    suggestionsContainer.add(0,new SuggestedWordInfo(typedWord,SuggestedWordInfo.MAX_SCORE,SuggestedWordInfo.KIND_TYPED,Dictionary.TYPE_USER_TYPED));
  }
  SuggestedWordInfo.removeDups(suggestionsContainer);
  final ArrayList<SuggestedWordInfo> suggestionsList;
  if (DBG && !suggestionsContainer.isEmpty()) {
    suggestionsList=getSuggestionsInfoListWithDebugInfo(typedWord,suggestionsContainer);
  }
 else {
    suggestionsList=suggestionsContainer;
  }
  return new SuggestedWords(suggestionsList,!isPrediction && !allowsToBeAutoCorrected,!isPrediction && hasAutoCorrection && allowsToBeAutoCorrected,false,false,isPrediction);
}