GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Codefix for implementing interfaces by paulvanbrenk · Pull Request #11547 · microsoft/TypeScript

Conversation

@paulvanbrenk

@paulvanbrenk Paul van Brenk (paulvanbrenk) commented Oct 12, 2016 •
edited by DanielRosenwasser
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

And fixing extends vs. implements

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

joshfriend reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Paul van Brenk added 2 commits October 11, 2016 14:09
Paul van Brenk
Codefixes for implement interface and change extends to implements.
1438f9a
Paul van Brenk
Merge branch 'pvb/codeaction/api' into interfaceFixes
7a5cb5f
@msftclas Microsoft Contribution License Agreements (msftclas) added the cla-not-required label Oct 12, 2016
mhegazy
Mohamed Hegazy (mhegazy) suggested changes Oct 13, 2016
View reviewed changes
Comment thread src/services/codefixes/changeExtendsToImplementsFix.ts Outdated
if (token.kind === SyntaxKind.Identifier && token.parent.parent.kind === SyntaxKind.HeritageClause) {
const children = (<HeritageClause>token.parent.parent).getChildren();
ts.forEach(children, child => {
if (child.kind === SyntaxKind.ExtendsKeyword) {

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is not sufficient. what if the class already has an implements clause. you want to first look for implements clause, and if you found one, move the interface to the implements list otherwise rename the extends to implements. one option is to generate two edits, one that always removes the extends clause all together, and another one that adds the target to the right place.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also please add tests.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Oct 31, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. The edit is to change extends -> implements, and if implements is already present, change implements -> ','

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated
@@ -0,0 +1,268 @@
/* @internal */
namespace ts.codefix {
registerCodeFix({

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please split these into different files. let's keep each code fix in its own file.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can still share the helpers between files if you need to.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Oct 31, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Split, and helpers moved to src/services/utilities.ts

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated

let textChanges: TextChange[] = [];

if (token.kind === SyntaxKind.Identifier && token.parent.kind === SyntaxKind.ClassDeclaration) {

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about classExpression? var x = class C implements I { }? use isClassLike instead

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Oct 28, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated

let textChanges: TextChange[] = [];

if (token.kind === SyntaxKind.Identifier && token.parent.kind === SyntaxKind.ClassDeclaration) {

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use isClassLike

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Oct 25, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated
const token = getTokenAtPosition(sourceFile, start);
const checker = context.program.getTypeChecker();

let textChanges: TextChange[] = [];

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is the point of this initialization, you can just override it below. consider just leaving this as undefined, and checking for undefined below.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Oct 25, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactored

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated
if (token.kind === SyntaxKind.Identifier && token.parent.kind === SyntaxKind.ClassDeclaration) {
const classDeclaration = <ClassDeclaration>token.parent;
const startPos = classDeclaration.members.pos;
const classMembers = getClassMembers(classDeclaration);

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you just need the abstract ones.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Oct 25, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated
const classMembers = getClassMembers(classDeclaration);
const trackingAddedMembers: string[] = [];
const extendsClause = ts.getClassExtendsHeritageClauseElement(classDeclaration);
textChanges = textChanges.concat(getChanges(extendsClause, classMembers, startPos, checker, /*reference*/ false, trackingAddedMembers, context.newLineCharacter));

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does not handle properties declared in the constructor as parameter property declarations, e.g. this should only add b and not a.

interface I {
    a: number,
    b:string;
}
class C implements I {
    constructor(public a) {}
}

Please add tests.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated
if (interfaceMembers[j].name && existingMembers.indexOf(interfaceMembers[j].name.getText()) === -1) {
if (interfaceMembers[j].kind === SyntaxKind.PropertySignature) {
const interfaceProperty = <PropertySignature>interfaceMembers[j];
if (trackingAddedMembers.indexOf(interfaceProperty.name.getText()) === -1) {

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this does not handle computed properties correctly. e.g. [Symbol.Iterator]. please add tests.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated
}

function getMembersAndStartPosFromReference(variableDeclaration: VariableDeclaration): { startPos: number, members: string[] } {
const children = variableDeclaration.getChildren();

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

variableDeclaration.initializer ?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/interfaceFixes.ts Outdated
/* @internal */
namespace ts.codefix {
registerCodeFix({
errorCodes: [Diagnostics.Type_0_is_not_assignable_to_type_1.code],

@mhegazy Mohamed Hegazy (mhegazy) Oct 13, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this code fix is not nearly close to being complete. please remove this from this patch and added by itself later on. i am not sure we should do this either. there are issues that are not fixable. and we are not detecting them and handling them correctly.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Oct 25, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed, and tests changed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Paul van Brenk and others added 5 commits October 13, 2016 16:29
Paul van Brenk
Merge branch 'master' into interfaceFixes
bf3e487
@aozgaa
Remove Type Assignability QuickFix
6b4f6b5
@aozgaa
Refactor classDeclarations
151f940
@aozgaa
Refactor Loop
d1cea73
@aozgaa
Rename Tests
c2feab6
mhegazy
Mohamed Hegazy (mhegazy) reviewed Oct 26, 2016
View reviewed changes
Comment thread tests/cases/fourslash/unImplementedInterface15.ts Outdated
}
`);
verify.not.codeFixAvailable();
// verify.codeFixAtPosition(`

@mhegazy Mohamed Hegazy (mhegazy) Oct 26, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why are these still here?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Nov 9, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Arthur Ozga (aozgaa) added 20 commits October 26, 2016 11:30
@aozgaa
temp
f74872d
@aozgaa
Merge branch 'master' into interfaceFixes
2abf906
@aozgaa
Covnert to Doc Comment
132b746
@aozgaa
more temp
ecc029f
@aozgaa
Split CodeFixes in Separate Files
a66b0ae
@aozgaa
Move codeFixProvider.ts
5d9a4e3
@aozgaa
Nerf Extends to implements For Now
3ac9ffa
@aozgaa
Simplify getCodeFixChanges
d24236b
@aozgaa
Rename Most Tests
7758e6d
@aozgaa
Rename and Add a Test
7272833
@aozgaa
Add Failing Tests
834245c
@aozgaa
Add removeAbstractModifier Fix
c89b97b
Still need to add localization strings
@aozgaa
extends->implements w/ implements keyword present
16dc834
@aozgaa
Cleanup Extends -> Interface Change
cbaea99
@aozgaa
Refactor fourslash testing for codeFixes
bc21346
@aozgaa
Remove unused tests
99ae5d9
@aozgaa
Fix linting errors
aa6ecd4
@aozgaa
Merge branch 'master' into interfaceFixes
3240000
@aozgaa
Recognize modifiers
0380f3f
@aozgaa
Remove unused
1b60a97
Arthur Ozga and others added 10 commits December 8, 2016 16:34
Arthur Ozga
add missing index signature support
2f51b36
Arthur Ozga
make index signature fix work with generics
97b3d7a
Arthur Ozga
Add tests and fix rest parameters
819a654
Arthur Ozga
cleanup
5e48e33
Arthur Ozga
Simplify rest parameter handling
1338b94
Arthur Ozga
Simplify index signature generation
b9ae36c
Arthur Ozga
Merge branch 'master' into interfaceFixes
d724517
Arthur Ozga
Synthetic signature uses existing parameter names
469745b
Arthur Ozga
Merge branch 'master' into interfaceFixes
1ba6c86
Arthur Ozga
Consolidate Tests
ad01110
mhegazy
Mohamed Hegazy (mhegazy) suggested changes Dec 12, 2016
View reviewed changes
Comment thread src/compiler/checker.ts Outdated
getReturnTypeOfSignature,
getNonNullableType,
getSymbolsInScope,
createSymbol,

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i would say use new Symbol() here.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Dec 14, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/compiler/checker.ts Outdated
getIndexTypeOfType,
getBaseTypes,
getUnionType,
getIntersectionType,

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if this is not used i would remove it for now.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Dec 14, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/compiler/checker.ts
getExportSpecifierLocalTargetSymbol,
getTypeAtLocation: getTypeOfNode,
getPropertySymbolOfDestructuringAssignment,
signatureToString,

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

consider inlining these two using checker.getSymbolDisplayBuilder().

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Dec 14, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

signatureToString is needed independently in the checker anyways, so I'd prefer to avoid copying the code if it can be avoided.

indexSignatureToString: Only used in one place in the current PR, but we may find it useful in a future codefix for adding index signatures. Will inline for now, but may have to re-declare it in the future.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts Outdated
const classDecl = <ClassDeclaration>token.parent;
const startPos = classDecl.members.pos;

const InstantiatedExtendsType = checker.getTypeFromTypeReference(getClassExtendsHeritageClauseElement(classDecl)) as InterfaceType;

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add a test for expression with type arguments case:

function foo<T>(a: T) {
    abstract class C<U> { 
        a: T;
        b: U;
        abstract method2();
    }
    return C;
}


class B extends foo("s")<number> { 
    method() { 
    }
}

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Dec 14, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts Outdated
const decls = symbol.getDeclarations();
Debug.assert(!!(decls && decls.length > 0));
const flags = getModifierFlags(decls[0]);
return !(flags & ModifierFlags.Private) && !!(flags & ModifierFlags.Abstract);

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i would ignore private here.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return symbol.valueDeclaration.flags & ModifierFlags.Private

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Dec 14, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needed to suppress fix when the user creates a class with a private abstract property/member. Is there a better way to detect general errors on a declaration/node? This would be useful to suppress codefixes in many situations.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts Outdated
}

function symbolRefersToNonPrivateMember(symbol: Symbol): boolean {
const decls = symbol.getDeclarations();

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just:

return symbol.valueDecaration.flags & ModifierFlags.Private

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Dec 14, 2016 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EDIT: moved response to the right place.

Made the change here.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/helpers.ts Outdated

function createParameterDeclaration(index: number, minArgCount: number, typeNode: TypeNode, enclosingSignatureDeclaration: SignatureDeclaration): ParameterDeclaration {
const newParameter = createNode(SyntaxKind.Parameter) as ParameterDeclaration;
newParameter.symbol = checker.createSymbol(SymbolFlags.FunctionScopedVariable, "arg" + index);

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i would rather we use a name form one of hte signatures.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/services/codefixes/helpers.ts Outdated
}

if (hasRestParameter) {
const anyArrayTypeNode = createNode(SyntaxKind.ArrayType) as ArrayTypeNode;

@mhegazy Mohamed Hegazy (mhegazy) Dec 10, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

consider making these implicitAny's instead by not setting a type, and handling this in the writer instead.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@aozgaa Arthur Ozga (aozgaa) Dec 14, 2016

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Arthur Ozga added 8 commits December 14, 2016 08:40
Arthur Ozga
abstract class expr instantiation and abstract fix works with class expr
3cfac08
Arthur Ozga
refactor fix
4673812
Arthur Ozga
add tests
4b02099
Arthur Ozga
simplify and inline methods
8be8819
Arthur Ozga
implicit any for synthesized signature
d75d548
Arthur Ozga
Merge branch 'master' into interfaceFixes
4af3937
Arthur Ozga
Cleanup
97f18c9
Arthur Ozga
Rename Tests
3fc94bb
@zhengbli
Zhengbo Li (zhengbli) dismissed their stale review December 21, 2016 19:47

Most of my reviews are updated

mhegazy
Mohamed Hegazy (mhegazy) approved these changes Dec 30, 2016
View reviewed changes
@mhegazy Mohamed Hegazy (mhegazy) closed this Dec 30, 2016
@mhegazy Mohamed Hegazy (mhegazy) reopened this Dec 30, 2016
@msftclas Microsoft Contribution License Agreements (msftclas) added the cla-not-required label Dec 30, 2016
@mhegazy
Mohamed Hegazy (mhegazy) merged commit 524fa64 into master Dec 30, 2016
@mhegazy
Mohamed Hegazy (mhegazy) deleted the interfaceFixes branch December 30, 2016 22:28
@jeffrey-easyesi Jeffrey Morlan (jeffrey-easyesi) mentioned this pull request Jan 9, 2017
Implement all abstract methods Everlaw/nbts#12
Closed
@mhegazy Mohamed Hegazy (mhegazy) mentioned this pull request Jan 17, 2017
add more refactoring tools #4985
Closed
@microsoft Microsoft (microsoft) locked and limited conversation to collaborators Jun 19, 2018
@typescript-bot TypeScript Bot (typescript-bot) unassigned Arthur Ozga (aozgaa) Jun 19, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

3 more reviewers
@aozgaa Arthur Ozga (aozgaa) aozgaa left review comments
@mhegazy Mohamed Hegazy (mhegazy) mhegazy approved these changes
@zhengbli Zhengbo Li (zhengbli) zhengbli left review comments
Reviewers whose approvals may not affect merge requirements

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

5 participants

@paulvanbrenk @aozgaa @zhengbli @mhegazy @msftclas
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.