Skip to content

Commit 9cb4c44

Browse files
committed
build(1.x): 目录结构优化
0 parents  commit 9cb4c44

83 files changed

Lines changed: 4482 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
Changelog
2+
=========
3+
4+
## 1.0.0-rc.1
5+
* 添加lombok功能
6+
7+
## 0.2.4
8+
* fix(main): 修复模板存在重复代码块、多空行时,代理断点映射行错误的问题
9+
10+
## 0.1
11+
* 项目初始化

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
IntelliJ IDEA / PhpStorm Hyperf Plugin
2+
========================
3+
[toc]
4+
5+
| Key | Value |
6+
|------------|-------------------------------------------|
7+
| Plugin Url | https://plugins.jetbrains.com/plugin/23007 |
8+
| ID | `io.maliboot.www.hyperf` |
9+
| Changelog | [CHANGELOG](CHANGELOG.md) |
10+
11+
# About
12+
这是一个对`hyperf`框架/组件、或者依赖`hyperf组件`的第三方`vendor`扩展包,提供功能支持的`PHPStorm`插件。
13+
14+
# Install
15+
* 通过插件市场安装 [Hyperf Support](https://plugins.jetbrains.com/plugin/23007) `Settings -> Plugins -> Browse repositories`
16+
* 通过本地磁盘安装 [Hyperf Support](https://github.com/maliboot/idea-hyperf-plugin/releases) `Settings -> Plugins -> Install Plugin from Disk...`,插件jar包可以在[release](https://github.com/maliboot/idea-hyperf-plugin/releases)页面找到
17+
* 预览版本只能通过[release](https://github.com/maliboot/idea-hyperf-plugin/releases)页面安装,里面包含了一些正在测试中的功能
18+
19+
# Feature
20+
## 基础适配
21+
* 重复类声明:当AOP类产生代理文件,屏蔽重复类声明的异常报错。如`App_User.proxy.php 处存在类 'User' 的其他声明`错误将不再显示
22+
* 拼写检查:屏蔽框架常用词如`hyperf``swoole``jsonrpc`等等单词的拼写错误警告。如有遗漏或补充,请提交Issue给我。
23+
24+
## debug
25+
本插件会定位`模板文件``代理文件`的断点所在行第一个`ast节点`,计算出该节点的树路径相对偏移量,得出对应文件的断点位置,尽可能让`hyperf`得以在`模板文件`内调试
26+
![Debug Preview](doc/xdebug.png)
27+
>>> hyperf的AOP会生成编译生成代理文件,如`app/IndexController.php`会生成`./runtime/container/proxy/APP_IndexController.proxy.php`代理文件。当程序启动时,`IndexController.php`变成了模板文件不再参与程序运行,`APP_IndexController.proxy.php`成为了实际上真正运行的文件,所以当debug调试程序时所有的`断点``堆栈列表日志`都追溯到了代理文件内。
28+
29+
## Lombok‼️(**该功能完全不依赖`代理文件`**
30+
![Debug Preview](doc/lombok.gif)
31+
* Lombok支持:[maliboot/lombok](https://github.com/maliboot/lombok)适配,解决该PHP扩展使用时编辑器没有自动补全、参数提示、错误语法高量、导航等功能。
32+
* **该功能完全不依赖`代理文件`**。旨在极端情况下,提供对[maliboot/lombok](https://github.com/maliboot/lombok)的全方位支持
33+
34+
# Idea
35+
* 如果使用插件过程中有报错,可以[提交堆栈报告](https://github.com/maliboot/idea-hyperf-plugin/issues/new?title=[BUG]XXX主题&body=...)给我。这对我非常重要,我会及时修复
36+
* 欢迎给我提功能建议👏,如果戳中了需求痛点,我会抽时间来开发。[点这里提需求](https://github.com/maliboot/idea-hyperf-plugin/issues/new?title=%E3%80%90%E5%8A%9F%E8%83%BD%E5%BB%BA%E8%AE%AE%E3%80%91XXX&body=...)

build.gradle.kts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
plugins {
2+
id("java")
3+
id("org.jetbrains.kotlin.jvm") version "1.9.20"
4+
id("org.jetbrains.intellij") version "1.16.0"
5+
}
6+
7+
group = "io.maliboot.devkit"
8+
version = "1.0.0-rc.3"
9+
10+
repositories {
11+
mavenCentral()
12+
}
13+
14+
intellij {
15+
pluginName.set("Hyperf Support")
16+
version.set("2023.1")
17+
type.set("PS")
18+
19+
plugins.set(listOf("com.jetbrains.php"))
20+
}
21+
22+
tasks {
23+
24+
compileKotlin {
25+
kotlinOptions.jvmTarget = "17"
26+
}
27+
28+
compileJava {
29+
sourceCompatibility = "17"
30+
targetCompatibility = "17"
31+
}
32+
33+
patchPluginXml {
34+
sinceBuild.set("231")
35+
untilBuild.set("232.*")
36+
changeNotes.set(file("src/main/resources/META-INF/change-notes.html").readText().replace("<html>", "").replace("</html>", ""))
37+
}
38+
39+
signPlugin {
40+
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
41+
privateKey.set(System.getenv("PRIVATE_KEY"))
42+
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
43+
}
44+
45+
publishPlugin {
46+
token.set(System.getenv("PUBLISH_TOKEN"))
47+
}
48+
}

doc/lombok.gif

1.96 MB
Loading

doc/xdebug.png

378 KB
Loading
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.maliboot.devkit.hyperf.common;
2+
3+
import com.intellij.openapi.project.DumbService;
4+
import com.intellij.openapi.project.Project;
5+
6+
public class MyJavaExt {
7+
8+
// fix.兼容某些SDK版本依赖异常报错-> java.lang.NoSuchFieldError: Companion
9+
public static Boolean isDump(Project project) {
10+
return DumbService.getInstance(project).isDumb();
11+
}
12+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package io.maliboot.devkit.idea
2+
3+
import com.intellij.ide.BrowserUtil
4+
import com.intellij.ide.plugins.PluginManagerCore
5+
import com.intellij.openapi.application.ApplicationInfo
6+
import com.intellij.openapi.diagnostic.ErrorReportSubmitter
7+
import com.intellij.openapi.diagnostic.IdeaLoggingEvent
8+
import com.intellij.openapi.diagnostic.SubmittedReportInfo
9+
import com.intellij.openapi.extensions.PluginId
10+
import com.intellij.openapi.util.SystemInfo
11+
import com.intellij.openapi.util.text.StringUtil
12+
import com.intellij.util.ArrayUtil
13+
import com.intellij.util.Consumer
14+
import java.awt.Component
15+
import java.net.URLEncoder
16+
import java.nio.charset.StandardCharsets
17+
18+
/**
19+
* Generates an issue creation link
20+
* https://github.com/maliboot/idea-hyperf-plugin/issues/new?title=foo&body=bar
21+
*/
22+
class GithubErrorReporter : ErrorReportSubmitter() {
23+
companion object {
24+
private const val URL = "https://github.com/maliboot/idea-hyperf-plugin/issues/new"
25+
private const val PLUGIN_ID = "io.maliboot.www.hyperf"
26+
}
27+
28+
override fun getReportActionText(): String {
29+
return "Report to Maliboot"
30+
}
31+
32+
@Suppress("SwallowedException")
33+
override fun submit(
34+
events: Array<out IdeaLoggingEvent>,
35+
additionalInfo: String?,
36+
parentComponent: Component,
37+
consumer: Consumer<in SubmittedReportInfo>
38+
): Boolean {
39+
val event = ArrayUtil.getFirstElement(events)
40+
var title = "[IDEA-Plugin]Exception: "
41+
var stacktrace = "Please paste the full stacktrace from the IDEA error popup.\n"
42+
if (event != null) {
43+
val throwableText = event.throwableText
44+
val exceptionTitle: String = throwableText.lines().first()
45+
title += if (!StringUtil.isEmptyOrSpaces(exceptionTitle)) exceptionTitle else "<Fill in title>"
46+
if (!StringUtil.isEmptyOrSpaces(throwableText)) {
47+
val quotes = "\n```\n"
48+
stacktrace += quotes + StringUtil.first(
49+
throwableText,
50+
6000,
51+
true
52+
) + quotes
53+
}
54+
}
55+
val plugin = PluginManagerCore.getPlugin(PluginId.getId(PLUGIN_ID))
56+
val pluginVersion = if (plugin != null) plugin.version else ""
57+
val ideaVersion = ApplicationInfo.getInstance().build.asString()
58+
val template = StringBuilder()
59+
template.append("### Description\n")
60+
if (additionalInfo != null) {
61+
template.append(additionalInfo).append("\n")
62+
}
63+
template.append("\n")
64+
template.append("### Stacktrace\n").append(stacktrace).append("\n")
65+
template.append("### Version and Environment Details\n")
66+
.append("Operation system: ").append(SystemInfo.getOsNameAndVersion()).append("\n")
67+
.append("IDE version: ").append(ideaVersion).append("\n")
68+
.append("Plugin version: ").append(pluginVersion).append("\n")
69+
val charset = StandardCharsets.UTF_8
70+
val url = String.format(
71+
"%s?title=%s&labels=%s&body=%s",
72+
URL,
73+
URLEncoder.encode(title, charset),
74+
URLEncoder.encode("error", charset),
75+
URLEncoder.encode(template.toString(), charset)
76+
)
77+
BrowserUtil.browse(url)
78+
consumer.consume(
79+
SubmittedReportInfo(
80+
null,
81+
"GitHub issue",
82+
SubmittedReportInfo.SubmissionStatus.NEW_ISSUE
83+
)
84+
)
85+
return true
86+
}
87+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.maliboot.devkit.idea.cola
2+
3+
import io.maliboot.devkit.idea.cola.dto.IsPropertyInitAnnotation
4+
import io.maliboot.devkit.idea.cola.dto.OfDOAnnotation
5+
import io.maliboot.devkit.idea.cola.dto.QueryDTOAnnotation
6+
import io.maliboot.devkit.idea.cola.dto.UserContextAnnotation
7+
import io.maliboot.devkit.idea.lombok.annotation.AbstractClassAnnotation
8+
import io.maliboot.devkit.idea.lombok.annotation.AbstractFieldAnnotation
9+
import io.maliboot.devkit.idea.lombok.annotation.AbstractMemberAnnotation
10+
import io.maliboot.devkit.idea.lombok.annotation.LombokAnnotationFactory
11+
import io.maliboot.devkit.idea.lombok.annotation.lightNode.PhpClassNode
12+
import io.maliboot.devkit.idea.lombok.annotation.lightNode.PhpFieldNode
13+
import kotlin.reflect.KClass
14+
15+
class ColaAnnotationRegister : LombokAnnotationFactory {
16+
override fun getClassAnnotationList(phpClassNode: PhpClassNode): List<AbstractClassAnnotation> {
17+
return listOf(
18+
OfEntityAnnotation(phpClassNode),
19+
ToEntityAnnotation(phpClassNode),
20+
IsPropertyInitAnnotation(phpClassNode),
21+
OfDOAnnotation(phpClassNode),
22+
QueryDTOAnnotation(phpClassNode),
23+
UserContextAnnotation(phpClassNode)
24+
)
25+
}
26+
27+
override fun getFieldAnnotationList(
28+
phpClassNode: PhpClassNode,
29+
phpFieldNode: PhpFieldNode
30+
): List<AbstractFieldAnnotation> {
31+
return listOf(
32+
)
33+
}
34+
35+
override fun getRegisterAttributes(): Map<String, List<KClass<out AbstractMemberAnnotation>>> {
36+
return ColaAttribute.allData
37+
}
38+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.maliboot.devkit.idea.cola
2+
3+
import io.maliboot.devkit.idea.cola.dto.IsPropertyInitAnnotation
4+
import io.maliboot.devkit.idea.cola.dto.OfDOAnnotation
5+
import io.maliboot.devkit.idea.cola.dto.QueryDTOAnnotation
6+
import io.maliboot.devkit.idea.cola.dto.UserContextAnnotation
7+
import io.maliboot.devkit.idea.lombok.annotation.AbstractMemberAnnotation
8+
import io.maliboot.devkit.idea.lombok.annotation.register.DelegateAnnotation
9+
import kotlin.reflect.KClass
10+
11+
class ColaAttribute {
12+
companion object {
13+
const val VO = "\\MaliBoot\\Dto\\Annotation\\ViewObject"
14+
15+
const val DTO = "\\MaliBoot\\Dto\\Annotation\\DataTransferObject"
16+
17+
const val DATABASE = "\\MaliBoot\\Cola\\Annotation\\Database"
18+
19+
const val AGGREGATE_ROOT = "\\MaliBoot\\Cola\\Annotation\\AggregateRoot"
20+
21+
const val ENTITY = "\\MaliBoot\\Cola\\Annotation\\Entity"
22+
23+
const val VALUE_OBJECT = "\\MaliBoot\\Cola\\Annotation\\ValueObject"
24+
25+
val structObject: List<KClass<out AbstractMemberAnnotation>> = io.maliboot.devkit.idea.lombok.LombokCollector.baseData + listOf(
26+
IsPropertyInitAnnotation::class,
27+
)
28+
29+
val baseDTO: List<KClass<out AbstractMemberAnnotation>> = structObject + listOf(UserContextAnnotation::class)
30+
31+
val allData: MutableMap<String, List<KClass<out AbstractMemberAnnotation>>> = mutableMapOf(
32+
VO to baseDTO + listOf(
33+
OfDOAnnotation::class,
34+
),
35+
DTO to baseDTO + listOf(
36+
OfDOAnnotation::class,
37+
QueryDTOAnnotation::class,
38+
),
39+
DATABASE to structObject + listOf(
40+
ToEntityAnnotation::class,
41+
OfEntityAnnotation::class,
42+
DelegateAnnotation::class,
43+
),
44+
AGGREGATE_ROOT to structObject,
45+
ENTITY to structObject,
46+
VALUE_OBJECT to structObject,
47+
)
48+
}
49+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.maliboot.devkit.idea.cola
2+
3+
import com.jetbrains.php.lang.psi.elements.PhpModifier
4+
import com.jetbrains.php.lang.psi.resolve.types.PhpType
5+
import com.jetbrains.php.lang.psi.resolve.types.PhpType.NULL
6+
import io.maliboot.devkit.idea.common.psi.data.CustomClass
7+
import io.maliboot.devkit.idea.common.psi.data.CustomField
8+
import io.maliboot.devkit.idea.common.psi.data.CustomMethod
9+
import io.maliboot.devkit.idea.common.psi.data.CustomParameter
10+
import io.maliboot.devkit.idea.lombok.annotation.AbstractClassAnnotation
11+
import io.maliboot.devkit.idea.lombok.annotation.lightNode.PhpClassNode
12+
13+
class OfEntityAnnotation(classNode: PhpClassNode) : AbstractClassAnnotation(classNode) {
14+
companion object {
15+
const val FEATURE = "ofEntity"
16+
}
17+
18+
override fun getCustomField(): List<CustomField> {
19+
return listOf()
20+
}
21+
22+
override fun getCustomMethod(): List<CustomMethod> {
23+
return listOf(
24+
CustomMethod(
25+
FEATURE,
26+
CustomClass(phpClassNode.type),
27+
"ofEntity",
28+
PhpType().add(phpClassNode.type).add(NULL),
29+
listOf(CustomParameter("entity", PhpType.OBJECT)),
30+
PhpModifier.PUBLIC_IMPLEMENTED_STATIC
31+
)
32+
)
33+
}
34+
}

0 commit comments

Comments
 (0)