Program: 17089
Project: 17089
Buggy source:
/** 
 * post visit   {@link ArrayAccessExpr} and set the result type as Array's component type
 * @param aae
 */
private void postVisitArrayAccessExpr(final ArrayAccessExpr aae){
  IJstType qualifierType=JstExpressionTypeLinkerHelper.getQualifierType(m_resolver,aae);
  if (qualifierType != null) {
    if (qualifierType instanceof JstArray) {
      JstExpressionTypeLinkerHelper.doExprTypeUpdate(m_resolver,this,aae,((JstArray)qualifierType).getComponentType(),m_groupInfo);
    }
    final IExpr indexExpr=aae.getIndex();
    if (indexExpr instanceof SimpleLiteral) {
      final SimpleLiteral indexLiteral=((SimpleLiteral)indexExpr);
      if ("String_Node_Str".equals(indexLiteral.getResultType().getName())) {
        final String indexValue=indexLiteral.getValue();
        final boolean isStatic=JstExpressionTypeLinkerHelper.isStaticRef(qualifierType);
        IJstProperty pty=JstExpressionTypeLinkerHelper.getProperty(qualifierType,indexValue,isStatic);
        if (pty == null) {
          pty=JstExpressionTypeLinkerHelper.getProperty(qualifierType,'"' + indexValue + '"',isStatic);
        }
        if (pty == null) {
          pty=JstExpressionTypeLinkerHelper.getProperty(qualifierType,"String_Node_Str" + indexValue + "String_Node_Str",isStatic);
        }
        if (pty != null) {
          aae.setType(pty.getType());
        }
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * post visit   {@link ArrayAccessExpr} and set the result type as Array's component type
 * @param aae
 */
private void postVisitArrayAccessExpr(final ArrayAccessExpr aae){
  IJstType qualifierType=JstExpressionTypeLinkerHelper.getQualifierType(m_resolver,aae);
  if (qualifierType != null) {
    if (qualifierType instanceof JstArray) {
      JstExpressionTypeLinkerHelper.doExprTypeUpdate(m_resolver,this,aae,((JstArray)qualifierType).getComponentType(),m_groupInfo);
    }
 else     if (qualifierType instanceof JstVariantType) {
      final JstVariantType variantQualifierType=(JstVariantType)qualifierType;
      final List<IJstType> variantTypes=variantQualifierType.getVariantTypes();
      final List<JstArray> arrayTypes=new ArrayList<JstArray>(variantTypes.size());
      for (      IJstType variantType : variantTypes) {
        if (variantType instanceof JstArray) {
          arrayTypes.add((JstArray)variantType);
        }
      }
      if (arrayTypes.size() == 1) {
        JstExpressionTypeLinkerHelper.doExprTypeUpdate(m_resolver,this,aae,arrayTypes.get(0).getComponentType(),m_groupInfo);
      }
 else       if (arrayTypes.size() > 1) {
        final List<IJstType> componentTypes=new ArrayList<IJstType>(arrayTypes.size());
        for (        JstArray arrayType : arrayTypes) {
          componentTypes.add(arrayType.getComponentType());
        }
        final JstVariantType variantComponentType=new JstVariantType(componentTypes);
        JstExpressionTypeLinkerHelper.doExprTypeUpdate(m_resolver,this,aae,variantComponentType,m_groupInfo);
      }
    }
    final IExpr indexExpr=aae.getIndex();
    if (indexExpr instanceof SimpleLiteral) {
      final SimpleLiteral indexLiteral=((SimpleLiteral)indexExpr);
      if ("String_Node_Str".equals(indexLiteral.getResultType().getName())) {
        final String indexValue=indexLiteral.getValue();
        final boolean isStatic=JstExpressionTypeLinkerHelper.isStaticRef(qualifierType);
        IJstProperty pty=JstExpressionTypeLinkerHelper.getProperty(qualifierType,indexValue,isStatic);
        if (pty == null) {
          pty=JstExpressionTypeLinkerHelper.getProperty(qualifierType,'"' + indexValue + '"',isStatic);
        }
        if (pty == null) {
          pty=JstExpressionTypeLinkerHelper.getProperty(qualifierType,"String_Node_Str" + indexValue + "String_Node_Str",isStatic);
        }
        if (pty != null) {
          aae.setType(pty.getType());
        }
      }
    }
  }
}