1 module tooling.UnifyRange; 2 3 import std.algorithm, std.array, std.file, std.stdio, std.exception, std.conv, std.typecons; 4 5 import tooling.Scanner; 6 import tooling.TreeRange; 7 import tooling.Tokenizer; 8 import tooling.TokenRange; 9 10 auto unifyFunctionsRange(Token[] tokens) 11 { 12 struct Result 13 { 14 this(Token[] tokens) 15 { 16 tokenRange_ = tokens.namespaceTokenRange; 17 } 18 19 bool empty() { return tokenRange_.empty; } 20 Token front() 21 { 22 if (!functionTokens_.empty) 23 { 24 return functionTokens_.front; 25 } 26 else 27 { 28 return tokenRange_.front.token_; 29 } 30 } 31 Result save() { return this; } 32 void popFront() 33 { 34 if (!functionTokens_.empty) 35 { 36 functionTokens_.popFront(); 37 } 38 if (functionTokens_.empty) 39 { 40 tokenRange_.popFront(); 41 if (!tokenRange_.empty) 42 { 43 auto t = tokenRange_.front; 44 if (t.entity_) 45 { 46 if (isNamespace(t.entity_)) 47 { 48 if (t.token_.value == "{") 49 { 50 entityStack_.length += 1; 51 } 52 else if (t.token_.value == "}") 53 { 54 entityStack_.popBack; 55 } 56 } 57 else if (t.entity_.type_ == "function") // && entityStack_) 58 { 59 if (t.entity_.name !in entityStack_.back) 60 { 61 entityStack_.back[t.entity_.name] = t.entity_; 62 functionTokens_ = t.entity_.tokens_; 63 } 64 else 65 { 66 popFront; 67 } 68 } 69 } 70 } 71 } 72 } 73 74 TokenRangeResult tokenRange_; 75 Token[] functionTokens_; 76 Entity[string][] entityStack_; 77 } 78 79 return Result(tokens); 80 }