forked from sorbet/sorbet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrivate.cc
56 lines (48 loc) · 2.46 KB
/
Private.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "rewriter/Private.h"
#include "ast/Helpers.h"
#include "ast/ast.h"
#include "core/Context.h"
#include "core/Names.h"
#include "core/core.h"
#include "core/errors/rewriter.h"
#include "rewriter/rewriter.h"
using namespace std;
namespace sorbet::rewriter {
vector<ast::ExpressionPtr> Private::run(core::MutableContext ctx, ast::Send *send) {
vector<ast::ExpressionPtr> empty;
if (send->numPosArgs() != 1) {
return empty;
}
auto mdef = ast::cast_tree<ast::MethodDef>(send->getPosArg(0));
if (mdef == nullptr) {
return empty;
}
if (send->fun == core::Names::private_() && mdef->flags.isSelfMethod) {
if (auto e = ctx.beginError(send->loc, core::errors::Rewriter::PrivateMethodMismatch)) {
e.setHeader("Use `{}` to define private class methods", "private_class_method");
auto replacementLoc = core::Loc{ctx.file, send->funLoc};
e.replaceWith("Replace with `private_class_method`", replacementLoc, "private_class_method");
}
} else if (send->fun == core::Names::privateClassMethod() && !mdef->flags.isSelfMethod) {
if (auto e = ctx.beginError(send->loc, core::errors::Rewriter::PrivateMethodMismatch)) {
e.setHeader("Use `{}` to define private instance methods", "private");
auto replacementLoc = core::Loc{ctx.file, send->funLoc};
e.replaceWith("Replace with `private`", replacementLoc, "private");
}
} else if (send->fun == core::Names::packagePrivate() && mdef->flags.isSelfMethod) {
if (auto e = ctx.beginError(send->loc, core::errors::Rewriter::PrivateMethodMismatch)) {
e.setHeader("Use `{}` to define package-private class methods", "package_private_class_method");
auto replacementLoc = core::Loc{ctx.file, send->funLoc};
e.replaceWith("Replace with `package_private_class_method`", replacementLoc,
"package_private_class_method");
}
} else if (send->fun == core::Names::packagePrivateClassMethod() && !mdef->flags.isSelfMethod) {
if (auto e = ctx.beginError(send->loc, core::errors::Rewriter::PrivateMethodMismatch)) {
e.setHeader("Use `{}` to define package-private instance methods", "package_private");
auto replacementLoc = core::Loc{ctx.file, send->funLoc};
e.replaceWith("Replace with `package_private`", replacementLoc, "package_private");
}
}
return empty;
}
}; // namespace sorbet::rewriter