Skip to content

Commit 6e1a992

Browse files
committed
feat (language): 支持 Groovy 语言
1 parent bb908f6 commit 6e1a992

7 files changed

Lines changed: 480 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ CodeForge 是一款轻量级、高性能的桌面代码执行器,专为开发
2727
- **Clojure**
2828
- **C++**
2929
- **Go**
30+
- **Groovy**
3031
- **Java**
3132
- **JavaScript (Browser)**
3233
- **JavaScript (jQuery)**

public/icons/groovy.svg

Lines changed: 102 additions & 0 deletions
Loading
Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
// Groovy 示例代码 - CodeForge 代码执行环境
2+
3+
// 类定义
4+
class Person {
5+
String name
6+
int age
7+
float height
8+
9+
Person(String name, int age, float height) {
10+
this.name = name
11+
this.age = age
12+
this.height = height
13+
}
14+
15+
void display() {
16+
println "姓名: ${name}, 年龄: ${age}, 身高: ${height} cm"
17+
}
18+
19+
String toString() {
20+
return "Person(name: ${name}, age: ${age}, height: ${height})"
21+
}
22+
}
23+
24+
// 函数定义
25+
def greetUser(name) {
26+
println "Hello, ${name}! 👋"
27+
}
28+
29+
def addNumbers(a, b) {
30+
return a + b
31+
}
32+
33+
def printList(list) {
34+
list.each { element ->
35+
print "${element} "
36+
}
37+
println ""
38+
}
39+
40+
def fibonacci(n) {
41+
if (n <= 1) return n
42+
return fibonacci(n - 1) + fibonacci(n - 2)
43+
}
44+
45+
// 主程序执行
46+
println "🎉 欢迎使用 CodeForge!"
47+
println "Welcome to CodeForge!"
48+
println ""
49+
50+
println "========================================="
51+
println " CodeForge Groovy "
52+
println "========================================="
53+
println ""
54+
55+
// 基本输出示例
56+
println "✅ Groovy 运行成功! (Groovy is working!)"
57+
println "⚡ 这是 Groovy 程序 (This is Groovy program)"
58+
println ""
59+
60+
// 变量操作
61+
def name = "CodeForge"
62+
def version = "Groovy"
63+
def number1 = 10
64+
def number2 = 20
65+
def result = addNumbers(number1, number2)
66+
67+
println "🔢 简单计算 (Simple calculation):"
68+
println "${number1} + ${number2} = ${result}"
69+
println ""
70+
71+
// 字符串操作和插值
72+
println "📝 字符串操作 (String operations):"
73+
println "平台名称 (Platform): ${name}"
74+
println "语言版本 (Language): ${version}"
75+
println "完整信息 (Full info): ${name} - ${version}"
76+
println ""
77+
78+
// 循环示例
79+
println "🔄 循环输出 (Loop output):"
80+
(1..5).each { i ->
81+
println "${i} 次输出 (Output #${i}): Hello from CodeForge!"
82+
}
83+
println ""
84+
85+
// 列表示例
86+
println "🍎 列表示例 (List example):"
87+
def fruits = ["苹果", "香蕉", "橙子", "葡萄"]
88+
fruits.eachWithIndex { fruit, index ->
89+
println "${index + 1}. ${fruit}"
90+
}
91+
println ""
92+
93+
// 条件判断
94+
def score = 85
95+
println "📊 成绩评估 (Score evaluation):"
96+
switch (score) {
97+
case { it >= 90 }:
98+
println "优秀! (Excellent!)"
99+
break
100+
case { it >= 80 }:
101+
println "良好! (Good!)"
102+
break
103+
case { it >= 60 }:
104+
println "及格 (Pass)"
105+
break
106+
default:
107+
println "需要努力 (Need improvement)"
108+
}
109+
println ""
110+
111+
// Groovy特有的属性访问
112+
println "🔍 动态属性示例 (Dynamic property example):"
113+
def obj = [:]
114+
obj.dynamicProperty = "动态值"
115+
obj.number = 42
116+
println "动态属性: ${obj.dynamicProperty}"
117+
println "数字属性: ${obj.number}"
118+
println "对象内容: ${obj}"
119+
println ""
120+
121+
// 函数示例
122+
println "🎭 函数示例 (Function example):"
123+
greetUser("CodeForge用户")
124+
println ""
125+
126+
// 集合操作示例
127+
println "💾 集合操作示例 (Collection operations):"
128+
def numbers = [1, 2, 3, 4, 5]
129+
def doubled = numbers.collect { it * 2 }
130+
def evens = numbers.findAll { it % 2 == 0 }
131+
def sum = numbers.sum()
132+
133+
println "原始列表: ${numbers}"
134+
println "每个数字乘以2: ${doubled}"
135+
println "偶数: ${evens}"
136+
println "总和: ${sum}"
137+
println ""
138+
139+
// 类和对象示例
140+
println "👤 类和对象示例 (Class and object example):"
141+
def person = new Person("张三", 25, 175.5f)
142+
person.display()
143+
println "toString方法: ${person}"
144+
println ""
145+
146+
// 递归示例
147+
println "🔄 递归示例 (Recursion example):"
148+
def fib_n = 7
149+
def fib_result = fibonacci(fib_n)
150+
println "斐波那契数列第${fib_n}项: ${fib_result}"
151+
println ""
152+
153+
// 数学运算示例
154+
println "📐 数学运算示例 (Math operations):"
155+
def angle = 45.0
156+
def radians = Math.toRadians(angle)
157+
println "sin(${angle}°) = ${Math.sin(radians).round(4)}"
158+
println "cos(${angle}°) = ${Math.cos(radians).round(4)}"
159+
println "sqrt(16) = ${Math.sqrt(16)}"
160+
println ""
161+
162+
// 位操作示例
163+
println "🔧 位操作示例 (Bitwise operations):"
164+
def a = 12 // 1100 in binary
165+
def b = 10 // 1010 in binary
166+
println "${a} & ${b} = ${a & b} (AND)"
167+
println "${a} | ${b} = ${a | b} (OR)"
168+
println "${a} ^ ${b} = ${a ^ b} (XOR)"
169+
println "~${a} = ${~a} (NOT)"
170+
println ""
171+
172+
// 枚举示例
173+
println "📋 枚举示例 (Enum example):"
174+
enum Weekday {
175+
MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4),
176+
FRIDAY(5), SATURDAY(6), SUNDAY(7)
177+
178+
final int value
179+
180+
Weekday(int value) {
181+
this.value = value
182+
}
183+
}
184+
185+
def today = Weekday.WEDNESDAY
186+
println "今天是星期${today.value}: ${today}"
187+
println ""
188+
189+
// 闭包示例
190+
println "🚀 闭包示例 (Closure example):"
191+
def multiplier = { x, y -> x * y }
192+
def greeter = { userName -> "Hello, ${userName}!" }
193+
def calculator = { operation, num1, num2 ->
194+
switch(operation) {
195+
case 'add': return num1 + num2
196+
case 'multiply': return num1 * num2
197+
case 'subtract': return num1 - num2
198+
default: return 0
199+
}
200+
}
201+
202+
println "闭包乘法 5 * 3 = ${multiplier(5, 3)}"
203+
println "闭包问候: ${greeter('Groovy')}"
204+
println "闭包计算器 (add, 10, 5) = ${calculator('add', 10, 5)}"
205+
println ""
206+
207+
// Map操作示例
208+
println "🗺️ Map操作示例 (Map operations):"
209+
def scores = [
210+
"张三": 85,
211+
"李四": 92,
212+
"王五": 78
213+
]
214+
215+
scores.each { key, value ->
216+
println "${key}: ${value}"
217+
}
218+
219+
def highScores = scores.findAll { key, value -> value >= 85 }
220+
println "高分学生: ${highScores}"
221+
println ""
222+
223+
// 正则表达式示例
224+
println "🔍 正则表达式示例 (Regex example):"
225+
def text = "CodeForge 2025 是最好的代码执行平台!"
226+
def pattern = ~/\d+/
227+
def matcher = text =~ pattern
228+
if (matcher) {
229+
println "找到数字: ${matcher[0]}"
230+
}
231+
232+
def emailPattern = ~/\w+@\w+\.\w+/
233+
def email = "test@codeforge.com"
234+
println "邮箱验证 '${email}': ${email ==~ emailPattern}"
235+
println ""
236+
237+
// 异常处理示例
238+
println "⚠️ 异常处理示例 (Exception handling):"
239+
try {
240+
def divisionResult = 10 / 0
241+
} catch (ArithmeticException e) {
242+
println "捕获异常: ${e.message}"
243+
} finally {
244+
println "finally块总是执行"
245+
}
246+
println ""
247+
248+
// 文件操作示例
249+
println "📁 字符串操作示例 (String operations):"
250+
def multilineString = """
251+
这是一个
252+
多行字符串
253+
示例
254+
"""
255+
println "多行字符串长度: ${multilineString.trim().split('\n').size()}"
256+
257+
def template = "Hello \${userName}, welcome to \${platformName}!"
258+
def binding = [userName: 'User', platformName: 'CodeForge']
259+
def engine = new groovy.text.SimpleTemplateEngine()
260+
def templateResult = engine.createTemplate(template).make(binding)
261+
println "模板结果: ${templateResult}"
262+
println ""
263+
264+
// 元编程示例
265+
println "🎯 元编程示例 (Metaprogramming example):"
266+
String.metaClass.reverseString = {
267+
delegate.reverse()
268+
}
269+
270+
String.metaClass.addPrefix = { prefix ->
271+
prefix + delegate
272+
}
273+
274+
def str = "CodeForge"
275+
println "原字符串: ${str}"
276+
println "反转字符串: ${str.reverseString()}"
277+
println "添加前缀: ${str.addPrefix('Hello ')}"
278+
println ""
279+
280+
println "🎯 CodeForge Groovy 代码执行完成!"
281+
println "🎯 CodeForge Groovy execution completed!"
282+
println ""
283+
println "感谢使用 CodeForge 代码执行环境! 🚀"
284+
println "Thank you for using CodeForge! 🚀"

src-tauri/src/plugins/groovy.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
use super::{LanguagePlugin, PluginConfig};
2+
use std::vec;
3+
4+
pub struct GroovyPlugin;
5+
6+
impl LanguagePlugin for GroovyPlugin {
7+
fn get_order(&self) -> i32 {
8+
19
9+
}
10+
11+
fn get_language_name(&self) -> &'static str {
12+
"Groovy"
13+
}
14+
15+
fn get_language_key(&self) -> &'static str {
16+
"groovy"
17+
}
18+
19+
fn get_file_extension(&self) -> String {
20+
self.get_config()
21+
.map(|config| config.extension.clone())
22+
.unwrap_or_else(|| "groovy".to_string())
23+
}
24+
25+
fn get_version_args(&self) -> Vec<&'static str> {
26+
vec!["--version"]
27+
}
28+
29+
fn get_path_command(&self) -> String {
30+
"which groovy".to_string()
31+
}
32+
33+
fn get_command(
34+
&self,
35+
_file_path: Option<&str>,
36+
_is_version: bool,
37+
_file_name: Option<String>,
38+
) -> String {
39+
if _is_version {
40+
// 获取版本信息时,返回解释器命令
41+
return "groovy".to_string();
42+
}
43+
44+
// 执行代码时
45+
if let Some(config) = self.get_config() {
46+
if let Some(run_cmd) = &config.run_command {
47+
return if let Some(file_name) = _file_name {
48+
run_cmd.replace("$filename", &file_name)
49+
} else {
50+
// 执行代码但没有文件名时,返回原始命令让框架处理 $filename 替换
51+
run_cmd.clone()
52+
};
53+
}
54+
}
55+
self.get_default_command()
56+
}
57+
58+
fn get_execute_args(&self, file_path: &str) -> Vec<String> {
59+
let cmd = if self.get_execute_home().is_some() {
60+
format!("./groovy {}", file_path)
61+
} else {
62+
format!("groovy {}", file_path)
63+
};
64+
65+
vec!["-c".to_string(), cmd]
66+
}
67+
68+
fn get_default_config(&self) -> PluginConfig {
69+
PluginConfig {
70+
enabled: true,
71+
language: String::from("groovy"),
72+
before_compile: None,
73+
extension: String::from("groovy"),
74+
execute_home: None,
75+
run_command: Some(String::from("bash")),
76+
after_compile: None,
77+
template: Some(String::from("// 在这里输入 Groovy 代码")),
78+
timeout: Some(30),
79+
}
80+
}
81+
82+
fn get_default_command(&self) -> String {
83+
self.get_config()
84+
.and_then(|config| config.run_command.clone())
85+
.unwrap_or_else(|| "groovy".to_string())
86+
}
87+
}

src-tauri/src/plugins/manager.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::plugins::c::CPlugin;
44
use crate::plugins::clojure::ClojurePlugin;
55
use crate::plugins::cpp::CppPlugin;
66
use crate::plugins::go::GoPlugin;
7+
use crate::plugins::groovy::GroovyPlugin;
78
use crate::plugins::java::JavaPlugin;
89
use crate::plugins::javascript_browser::JavaScriptBrowserPlugin;
910
use crate::plugins::javascript_jquery::JavaScriptJQueryPlugin;
@@ -46,6 +47,7 @@ impl PluginManager {
4647
plugins.insert("applescript".to_string(), Box::new(AppleScriptPlugin));
4748
plugins.insert("typescript".to_string(), Box::new(TypeScriptPlugin));
4849
plugins.insert("cpp".to_string(), Box::new(CppPlugin));
50+
plugins.insert("groovy".to_string(), Box::new(GroovyPlugin));
4951
plugins.insert(
5052
"javascript-nodejs".to_string(),
5153
Box::new(JavaScriptNodeJsPlugin),

0 commit comments

Comments
 (0)