Skip to content

Commit

Permalink
Add save action that adds missing override keywords
Browse files Browse the repository at this point in the history
Only works with defs and types, but not yet with vals.
  • Loading branch information
kiritsuku committed Sep 2, 2014
1 parent 0078a94 commit ffe6ec1
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.scalaide.core.internal.extensions.saveactions

import org.scalaide.core.compiler.ScalaPresentationCompiler
import scala.reflect.internal.util.SourceFile
import org.scalaide.extensions.CompilerSupport
import org.scalaide.extensions.saveactions.AddMissingOverride

object AddMissingOverrideCreator {
def create(
c: ScalaPresentationCompiler,
t: ScalaPresentationCompiler#Tree,
sf: SourceFile,
selectionStart: Int,
selectionEnd: Int): AddMissingOverride =
new AddMissingOverride {
override val global = c
override val sourceFile = sf
override val selection = new FileSelection(
sf.file, t.asInstanceOf[global.Tree], selectionStart, selectionEnd)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.scalaide.extensions
package saveactions

object AddMissingOverrideSetting extends SaveActionSetting(
id = ExtensionSetting.fullyQualifiedName[AddMissingOverride],
name = "Add missing override keyword",
description = "Adds the override keyword to all symbols that override another symbol.",
codeExample = """|trait T {
| def method: Int
| def value: Int
| type Type
|}
|class C extends T {
| def method = 0
| def value = 0
| type Type = Int
|}
|""".stripMargin
)

/**
* This save action is not yet completed. It does't add the `override` keyword
* to vals, only to defs and types.
*/
trait AddMissingOverride extends SaveAction with CompilerSupport {
import global._

def setting = AddMissingOverrideSetting

def perform() = {
val symbolWithoutOverride = filter {
case d @ (_: DefDef | _: TypeDef) =>
d.symbol.isOverridingSymbol && !d.symbol.isOverride
}

/**
* Alternative (preferred) implementation:
* {{{
* mods.copy().withPosition(Flag.OVERRIDE, pos)
* }}}
* The above does not work due to a limitation in scala-refactoring.
*/
def modsWithOverrideKeyword(mods: Modifiers, pos: Position): Modifiers =
mods.copy() setPositions Map(Flag.OVERRIDE -> pos) ++ mods.positions

val addOverrideKeyword = transform {
case d: DefDef =>
d.mods.copy() withPosition(Flag.OVERRIDE, d.pos)
val mods = modsWithOverrideKeyword(d.mods, d.pos)
d.copy(mods = mods | Flag.OVERRIDE) replaces d

case d: TypeDef =>
val mods = modsWithOverrideKeyword(d.mods, d.pos)
d.copy(mods = mods | Flag.OVERRIDE) replaces d
}

val refactoring = topdown {
matchingChildren {
symbolWithoutOverride &> addOverrideKeyword
}
}
transformFile(refactoring)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.eclipse.jface.text.IDocument
import org.eclipse.jface.text.IRegion
import org.scalaide.core.ScalaPlugin
import org.scalaide.core.compiler.ScalaPresentationCompiler
import org.scalaide.core.internal.extensions.saveactions.AddMissingOverrideCreator
import org.scalaide.core.internal.extensions.saveactions.AddNewLineAtEndOfFileCreator
import org.scalaide.core.internal.extensions.saveactions.AutoFormattingCreator
import org.scalaide.core.internal.extensions.saveactions.RemoveTrailingWhitespaceCreator
Expand All @@ -18,6 +19,7 @@ import org.scalaide.core.text.Change
import org.scalaide.core.text.TextChange
import org.scalaide.extensions.SaveAction
import org.scalaide.extensions.SaveActionSetting
import org.scalaide.extensions.saveactions.AddMissingOverrideSetting
import org.scalaide.extensions.saveactions.AddNewLineAtEndOfFileSetting
import org.scalaide.extensions.saveactions.AutoFormattingSetting
import org.scalaide.extensions.saveactions.RemoveTrailingWhitespaceSetting
Expand All @@ -33,7 +35,8 @@ object SaveActionExtensions {
val saveActionSettings: Seq[SaveActionSetting] = Seq(
RemoveTrailingWhitespaceSetting,
AddNewLineAtEndOfFileSetting,
AutoFormattingSetting
AutoFormattingSetting,
AddMissingOverrideSetting
)
}

Expand Down Expand Up @@ -86,7 +89,8 @@ trait SaveActionExtensions extends HasLogger {
* Applies all save actions that extends [[CompilerSupport]].
*/
private def applyCompilerExtensions(udoc: IDocument) = {
val exts = Seq[CompilerSupportCreator](
val exts = Seq(
AddMissingOverrideCreator.create _
)

for (ext <- exts) {
Expand Down

0 comments on commit ffe6ec1

Please sign in to comment.