/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package standardDsls

/**
 * Hackergarten contribution
 *
 * @author Sibylle Peter
 * @author Andres Almiray
 */

import com.intellij.psi.PsiArrayType
import com.intellij.psi.PsiClassType

contributor(ctype: hasField(hasAnnotation('groovy.transform.IndexedProperty'))) {
  for (field in psiClass?.fields?.grep {it.hasAnnotation("groovy.transform.IndexedProperty")}) {
    String propertyName = field.name
    def psiElementType = field.type
    String type = 'java.lang.Object'
    if (psiElementType instanceof PsiArrayType) {
      type = psiElementType.componentType.className
    } else if (psiElementType instanceof PsiClassType) {
      type = field.type.parameters ? field.type.parameters[0].className : 'java.lang.Object'
    }
    propertyName = propertyName.size() == 1 ? propertyName.toUpperCase() : propertyName[0].toUpperCase() + propertyName[1..-1]
    method name: 'get' + propertyName, type: type, params: [index: 'int']
    method name: 'set' + propertyName, type: 'void', params: [index: 'int', element: type]
  }
}