Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 29 additions & 13 deletions ImportExtension/AddImportOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,49 @@ class AddImportOperation {

func execute() {
let selection = self.buffer.selections.firstObject as! XCSourceTextRange
let selectionLine = selection.start.line
let importString = (self.buffer.lines[selectionLine] as! String).trimmingCharacters(in: CharacterSet.whitespaces)
var selectionLine = selection.start.line

var importString = (self.buffer.lines[selectionLine] as! String).trimmingCharacters(in: CharacterSet.whitespaces)
importString = importString.trimmingCharacters(in: CharacterSet.init(charactersIn: " \t\n"))

guard isValid(importString: importString) else {
return
}
let line = appropriateLine(ignoringLine: selectionLine)

//remove duplicate imports
let removeNum = removeDuplicate(importString: importString)
selectionLine = selectionLine-removeNum

let line = appropriateLine()
guard line != NSNotFound else {
return
}

self.buffer.lines.removeObject(at: selectionLine)
self.buffer.lines.insert(importString, at: line)

//add a new selection. Bug fix for #7
let selectionPosition = XCSourceTextRange.init(start: XCSourceTextPosition.init(line: 0, column: 0), end: XCSourceTextPosition.init(line: 0, column: 0))
let selectionPosition = XCSourceTextRange.init(start: XCSourceTextPosition.init(line: selectionLine, column: 0), end: XCSourceTextPosition.init(line: selectionLine, column: 0))
self.buffer.selections.removeAllObjects()
self.buffer.selections.insert(selectionPosition, at: 0)
}

func removeDuplicate(importString: String) -> Int {

//do not forget itself
var lineNumber = -1;

let tempLines = NSMutableArray.init(array: buffer.lines)
tempLines.enumerateObjects(options: .reverse) { (line, index, stop) in
let string = (line as! String).trimmingCharacters(in: CharacterSet.init(charactersIn: " \t\n"))
if string == importString {
buffer.lines.removeObject(at: index)
lineNumber += 1
}
}

return lineNumber
}

func isValid(importString: String) -> Bool {
var numberOfMatches = 0
let matchingOptions = NSRegularExpression.MatchingOptions(rawValue: UInt(0))
Expand All @@ -65,15 +88,12 @@ class AddImportOperation {
return numberOfMatches > 0
}

func appropriateLine(ignoringLine: Int) -> Int {
func appropriateLine() -> Int {
var lineNumber = NSNotFound
let lines = buffer.lines as NSArray as! [String]

//Find the line that is first after all the imports
for (index, line) in lines.enumerated() {
if index == ignoringLine {
continue
}

if isValid(importString: line) {
lineNumber = index
Expand All @@ -86,10 +106,6 @@ class AddImportOperation {

//if a line is not found, find first free line after comments
for (index, line) in lines.enumerated() {
if index == ignoringLine {
continue
}

lineNumber = index
if line.isWhitespaceOrNewline() {
break
Expand Down