Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception analyzing file #2139

Closed
AlexCzar opened this issue Nov 28, 2019 · 1 comment
Closed

Exception analyzing file #2139

AlexCzar opened this issue Nov 28, 2019 · 1 comment
Milestone

Comments

@AlexCzar
Copy link
Contributor

AlexCzar commented Nov 28, 2019

Observed Behavior

exception in the log

persistence/BaseEntity.kt' led to an exception.
The original exception message was: List is empty.
Running detekt '1.2.0' on Java '11.0.5+10-suse-1.1-x8664' on OS 'Linux'.
If the exception message does not help, please feel free to create an issue on our GitHub page.
kotlin.collections.CollectionsKt___CollectionsKt.first(_Collections.kt:196)
io.gitlab.arturbosch.detekt.rules.bugs.EqualsAlwaysReturnsTrueOrFalse.isSingleReturnWithBooleanConstant(EqualsAlwaysReturnsTrueOrFalse.kt:71)
io.gitlab.arturbosch.detekt.rules.bugs.EqualsAlwaysReturnsTrueOrFalse.returnsBooleanConstant(EqualsAlwaysReturnsTrueOrFalse.kt:63)
io.gitlab.arturbosch.detekt.rules.bugs.EqualsAlwaysReturnsTrueOrFalse.visitNamedFunction(EqualsAlwaysReturnsTrueOrFalse.kt:52)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedFunction(KtVisitorVoid.java:483)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedFunction(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtNamedFunction.accept(KtNamedFunction.java:50)
org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:59)
org.jetbrains.kotlin.com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtVisitor.visitClassBody(KtVisitor.java:98)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassBody(KtVisitorVoid.java:89)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassBody(KtVisitorVoid.java:537)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassBody(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtClassBody.accept(KtClassBody.kt:38)
org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:59)
org.jetbrains.kotlin.com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtVisitor.visitExpression(KtVisitor.java:182)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:169)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:659)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtVisitor.visitDeclaration(KtVisitor.java:29)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:29)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:453)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtVisitor.visitNamedDeclaration(KtVisitor.java:398)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedDeclaration(KtVisitorVoid.java:381)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedDeclaration(KtVisitorVoid.java:959)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedDeclaration(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtVisitor.visitClassOrObject(KtVisitor.java:41)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:37)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:465)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtVisitor.visitClass(KtVisitor.java:33)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClass(KtVisitorVoid.java:33)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClass(KtVisitorVoid.java:459)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitClass(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtClass.accept(KtClass.kt:20)
org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:59)
org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.SharedImplUtil.acceptChildren(SharedImplUtil.java:200)
org.jetbrains.kotlin.com.intellij.psi.impl.source.PsiFileImpl.acceptChildren(PsiFileImpl.java:735)
org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
org.jetbrains.kotlin.com.intellij.psi.PsiElementVisitor.visitFile(PsiElementVisitor.java:34)
org.jetbrains.kotlin.psi.KtVisitor.visitKtFile(KtVisitor.java:73)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:69)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:513)
org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:21)
org.jetbrains.kotlin.psi.KtFile.accept(KtFile.kt:242)
org.jetbrains.kotlin.psi.KtFile.accept(KtFile.kt:229)
io.gitlab.arturbosch.detekt.api.BaseRule.visit(BaseRule.kt:53)
io.gitlab.arturbosch.detekt.api.BaseRule.visitFile(BaseRule.kt:43)
io.gitlab.arturbosch.detekt.api.RuleSet.accept(RuleSet.kt:35)
io.gitlab.arturbosch.detekt.core.Detektor.analyze(Detektor.kt:76)
io.gitlab.arturbosch.detekt.core.Detektor.runSync(Detektor.kt:44)
io.gitlab.arturbosch.detekt.core.Detektor.run(Detektor.kt:28)
io.gitlab.arturbosch.detekt.core.DetektFacade.run(DetektFacade.kt:41)
io.gitlab.arturbosch.detekt.cli.runners.Runner.execute(Runner.kt:29)
io.gitlab.arturbosch.detekt.cli.Main.main(Main.kt:16)

Steps to Reproduce

Analysing following file:

package persistence

import org.hibernate.annotations.BatchSize
import org.hibernate.annotations.OptimisticLock
import org.springframework.data.util.ProxyUtils
import java.io.Serializable
import java.time.LocalDateTime
import javax.persistence.Column
import javax.persistence.MappedSuperclass
import javax.persistence.PreUpdate
import javax.persistence.Transient
import javax.persistence.Version

private const val STATIC_HASHCODE: Int = 17

@MappedSuperclass
@BatchSize(size = 10)
abstract class BaseEntity<ID : Serializable> {

	@Version
	@Column(name = "entity_version", nullable = false)
	val entityVersion: Long? = null

	@OptimisticLock(excluded = true)
	@Column(name = "entity_created", nullable = false)
	val created = LocalDateTime.now()

	@OptimisticLock(excluded = true)
	@Column(name = "entity_updated", nullable = false)
	var updated = LocalDateTime.now()

	/**
	 * Direct use of `id` is strongly discouraged in business level code, this should only be used on the persistence
	 * level by the framework and related infrastructure code.
	 */
	@Suppress("PropertyName")
	protected abstract var id: ID?
	/**
	 * Accessing `savedId` implies that entity has been retrieved from a repository or crafted with a pre-set identifier.
	 * If this condition is not met, accessing it will generate an `IllegalStateException`.
	 */
	val savedId: ID
		@Transient get() = checkNotNull(id) { "Entity has not been saved" }

	override fun toString(): String = "${javaClass.simpleName} { id: $id }"

	override fun equals(other: Any?): Boolean = when {
		this === other -> true
		javaClass != other?.let<Any, Class<*>>(ProxyUtils::getUserClass) -> false
		else -> {
			other as BaseEntity<*>
			id != null && id == other.id
		}
	}

	@PreUpdate
	fun onPreUpdate() {
		updated = LocalDateTime.now()
	}

	override fun hashCode(): Int = STATIC_HASHCODE + ((this.id?.hashCode() ?: 0) * 31)
}

Your Environment

  • Version of detekt used: 1.2.0
  • Version of Gradle used (if applicable): 6.0.1
  • Operating System and version: OpenSUSE Tumbleweed [latest updates]
    gradle detekt config:
detekt {
	config = files("${rootProject.projectDir}/detekt.yml")
	buildUponDefaultConfig = true
	reports {
		txt.enabled = false
	}
}

detekt extensions: io.gitlab.arturbosch.detekt:detekt-formatting

detekt.yml:

build:
  maxIssues: 0

formatting:
  ParameterListWrapping:
    active: false
  NoConsecutiveBlankLines:
    active: false
  FinalNewline:
    active: false
  NoWildcardImports:
    #this is disabled in favour of configurable `style:WildcardImport` rule
    active: false

style:
  NewLineAtEndOfFile:
    active: false
  MagicNumber:
    ignoreNumbers: '-1,0,1,2,100'

console-reports:
  active: true
  exclude:
    - 'ProjectStatisticsReport'
    - 'ComplexityReport'
@arturbosch
Copy link
Member

Thanks for the great bug report.
I've verified that your code works with the fix provided by @schalkms in #2103 for 1.2.1.

@arturbosch arturbosch added this to the 1.2.1 milestone Nov 28, 2019
@lock lock bot locked as resolved and limited conversation to collaborators Mar 10, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants