blob: bf554ad909b160fd56b6cb60c9b50a6031ad9795 [file] [log] [blame]
/*
* Copyright (c) 2010-2020 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
*/
package org.eclipse.scout.sdk.s2i.classid
import com.intellij.codeInspection.LocalQuickFix
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.openapi.project.Project
import com.intellij.psi.LanguageAnnotationSupport
import com.intellij.psi.PsiLiteral
import org.eclipse.scout.sdk.core.s.classid.ClassIds
import org.eclipse.scout.sdk.s2i.EclipseScoutBundle
import org.eclipse.scout.sdk.s2i.environment.IdeaProgress
import org.eclipse.scout.sdk.s2i.environment.TransactionManager
import org.eclipse.scout.sdk.s2i.environment.TransactionManager.Companion.runInNewTransaction
import org.eclipse.scout.sdk.s2i.environment.TransactionMember
import org.eclipse.scout.sdk.s2i.toNioPath
import java.nio.file.Path
open class ChangeClassIdValueQuickFix(val annotation: ClassIdAnnotation) : LocalQuickFix {
val quickFixName = EclipseScoutBundle.message("update.with.new.classid")
override fun getFamilyName(): String = quickFixName
override fun applyFix(project: Project, descriptor: ProblemDescriptor) = runInNewTransaction(project, quickFixName) {
val newClassIdValue = ClassIds.next(annotation.psiClass.qualifiedName)
val javaAnnotationSupport = LanguageAnnotationSupport.INSTANCE.forLanguage(annotation.psiClass.language)
val value = javaAnnotationSupport.createLiteralValue(newClassIdValue, annotation.psiAnnotation)
val targetFile = annotation.psiAnnotation.containingFile.virtualFile.toNioPath()
TransactionManager.current().register(UpdateClassIdValue(annotation, value, targetFile))
}
companion object {
private class UpdateClassIdValue(val annotation: ClassIdAnnotation, val newValue: PsiLiteral, val targetFile: Path) : TransactionMember {
override fun file() = targetFile
override fun commit(progress: IdeaProgress): Boolean {
annotation.psiAnnotation.setDeclaredAttributeValue(ClassIdAnnotation.VALUE_ATTRIBUTE_NAME, newValue)
return true
}
}
}
}